/****************************************************************************
*
*    The MIT License (MIT)
*
*    Copyright (c) 2014 - 2023 Vivante Corporation
*
*    Permission is hereby granted, free of charge, to any person obtaining a
*    copy of this software and associated documentation files (the "Software"),
*    to deal in the Software without restriction, including without limitation
*    the rights to use, copy, modify, merge, publish, distribute, sublicense,
*    and/or sell copies of the Software, and to permit persons to whom the
*    Software is furnished to do so, subject to the following conditions:
*
*    The above copyright notice and this permission notice shall be included in
*    all copies or substantial portions of the Software.
*
*    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
*    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
*    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
*    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
*    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
*    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
*    DEALINGS IN THE SOFTWARE.
*
*****************************************************************************
*
*    The GPL License (GPL)
*
*    Copyright (C) 2014 - 2023 Vivante Corporation
*
*    This program is free software; you can redistribute it and/or
*    modify it under the terms of the GNU General Public License
*    as published by the Free Software Foundation; either version 2
*    of the License, or (at your option) any later version.
*
*    This program is distributed in the hope that it will be useful,
*    but WITHOUT ANY WARRANTY; without even the implied warranty of
*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*    GNU General Public License for more details.
*
*    You should have received a copy of the GNU General Public License
*    along with this program; if not, write to the Free Software Foundation,
*    Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*****************************************************************************
*
*    Note: This software is released under dual MIT and GPL licenses. A
*    recipient may use this file under the terms of either the MIT license or
*    GPL License. If you wish to use only one license not the other, you can
*    indicate your decision by deleting one of the above license notices in your
*    version of this file.
*
*****************************************************************************/


#ifndef __gc_hal_shared_enum_h_
#define __gc_hal_shared_enum_h_

#ifdef __cplusplus
extern "C" {
#endif

/* Chip models. */
typedef enum _gceCHIPMODEL {
    gcv200  = 0x0200,
    gcv300  = 0x0300,
    gcv320  = 0x0320,
    gcv328  = 0x0328,
    gcv350  = 0x0350,
    gcv355  = 0x0355,
    gcv400  = 0x0400,
    gcv410  = 0x0410,
    gcv420  = 0x0420,
    gcv428  = 0x0428,
    gcv450  = 0x0450,
    gcv500  = 0x0500,
    gcv520  = 0x0520,
    gcv530  = 0x0530,
    gcv600  = 0x0600,
    gcv620  = 0x0620,
    gcv700  = 0x0700,
    gcv800  = 0x0800,
    gcv820  = 0x0820,
    gcv860  = 0x0860,
    gcv880  = 0x0880,
    gcv900  = 0x0900,
    gcv1000 = 0x1000,
    gcv1500 = 0x1500,
    gcv2000 = 0x2000,
    gcv2100 = 0x2100,
    gcv2200 = 0x2200,
    gcv2500 = 0x2500,
    gcv3000 = 0x3000,
    gcv4000 = 0x4000,
    gcv5000 = 0x5000,
    gcv5200 = 0x5200,
    gcv6400 = 0x6400,
    gcv7000 = 0x7000,
    gcv7400 = 0x7400,
    gcv8000 = 0x8000,
    gcv8400 = 0x8400,
    gcv8800 = 0x8800,
    gcv9100 = 0x9100,
    gcv9200 = 0x9200,
} gceCHIPMODEL;

/* Chip features. */
typedef enum _gceFEATURE {
    gcvFEATURE_PIPE_2D = 0,
    gcvFEATURE_PIPE_3D,
    gcvFEATURE_PIPE_VG,
    gcvFEATURE_DC,
    gcvFEATURE_HIGH_DYNAMIC_RANGE,
    gcvFEATURE_MODULE_CG,
    gcvFEATURE_MIN_AREA,
    gcvFEATURE_BUFFER_INTERLEAVING,
    gcvFEATURE_BYTE_WRITE_2D,
    gcvFEATURE_ENDIANNESS_CONFIG,
    gcvFEATURE_DUAL_RETURN_BUS,
    gcvFEATURE_DEBUG_MODE,
    gcvFEATURE_YUY2_RENDER_TARGET,
    gcvFEATURE_FRAGMENT_PROCESSOR,
    gcvFEATURE_2DPE20,
    gcvFEATURE_FAST_CLEAR,
    gcvFEATURE_YUV420_TILER,
    gcvFEATURE_YUY2_AVERAGING,
    gcvFEATURE_FLIP_Y,
    gcvFEATURE_EARLY_Z,
    gcvFEATURE_COMPRESSION,
    gcvFEATURE_MSAA,
    gcvFEATURE_SPECIAL_ANTI_ALIASING,
    gcvFEATURE_SPECIAL_MSAA_LOD,
    gcvFEATURE_422_TEXTURE_COMPRESSION,
    gcvFEATURE_DXT_TEXTURE_COMPRESSION,
    gcvFEATURE_ETC1_TEXTURE_COMPRESSION,
    gcvFEATURE_TX_ETC2_COMPRESSION,
    gcvFEATURE_CORRECT_TEXTURE_CONVERTER,
    gcvFEATURE_TEXTURE_8K,
    gcvFEATURE_SCALER,
    gcvFEATURE_YUV420_SCALER,
    gcvFEATURE_SHADER_HAS_W,
    gcvFEATURE_SHADER_HAS_SIGN,
    gcvFEATURE_SHADER_HAS_FLOOR,
    gcvFEATURE_SHADER_HAS_CEIL,
    gcvFEATURE_SHADER_HAS_SQRT,
    gcvFEATURE_SHADER_HAS_TRIG,
    gcvFEATURE_SH_SUPERSCALAR_ARCH,
    gcvFEATURE_HZ,
    gcvFEATURE_CORRECT_STENCIL,
    gcvFEATURE_VG20,
    gcvFEATURE_VG_FILTER,
    gcvFEATURE_VG21,
    gcvFEATURE_VG_DOUBLE_BUFFER,
    gcvFEATURE_VG_RESOLUTION_8K,
    gcvFEATURE_MC20,
    gcvFEATURE_SUPER_TILED,
    gcvFEATURE_FAST_CLEAR_FLUSH,
    gcvFEATURE_2D_FILTERBLIT_PLUS_ALPHABLEND,
    gcvFEATURE_2D_DITHER,
    gcvFEATURE_2D_A8_TARGET,
    gcvFEATURE_2D_A8_NO_ALPHA,
    gcvFEATURE_2D_FILTERBLIT_FULLROTATION,
    gcvFEATURE_2D_BITBLIT_FULLROTATION,
    gcvFEATURE_WIDE_LINE,
    gcvFEATURE_FC_FLUSH_STALL,
    gcvFEATURE_FULL_DIRECTFB,
    gcvFEATURE_HALF_FLOAT_PIPE,
    gcvFEATURE_LINE_LOOP,
    gcvFEATURE_2D_YUV_BLIT,
    gcvFEATURE_2D_TILING,
    gcvFEATURE_NON_POWER_OF_TWO,
    gcvFEATURE_3D_TEXTURE,
    gcvFEATURE_TEXTURE_ARRAY,
    gcvFEATURE_TILE_FILLER,
    gcvFEATURE_LOGIC_OP,
    gcvFEATURE_MIXED_STREAMS,
    gcvFEATURE_2D_MULTI_SOURCE_BLT,
    gcvFEATURE_END_EVENT,
    gcvFEATURE_VERTEX_10_10_10_2,
    gcvFEATURE_TEXTURE_10_10_10_2,
    gcvFEATURE_TEXTURE_ANISOTROPIC_FILTERING,
    gcvFEATURE_TEXTURE_FLOAT_HALF_FLOAT,
    gcvFEATURE_2D_ROTATION_STALL_FIX,
    gcvFEATURE_2D_MULTI_SOURCE_BLT_EX,
    gcvFEATURE_BUG_FIXES10,
    gcvFEATURE_2D_MINOR_TILING,
    gcvFEATURE_TEX_COMPRRESSION_SUPERTILED, /* Supertiled compressed textures are supported. */
    gcvFEATURE_FAST_MSAA,
    gcvFEATURE_BUG_FIXED_INDEXED_TRIANGLE_STRIP,
    gcvFEATURE_TEXTURE_TILE_STATUS_READ,
    gcvFEATURE_DEPTH_BIAS_FIX,
    gcvFEATURE_RECT_PRIMITIVE,
    gcvFEATURE_BUG_FIXES11,
    gcvFEATURE_SUPERTILED_TEXTURE,
    gcvFEATURE_2D_NO_COLORBRUSH_INDEX8,
    gcvFEATURE_RS_YUV_TARGET,
    gcvFEATURE_2D_FC_SOURCE, /* For tilestatus compression feature*/
    gcvFEATURE_2D_CC_NOAA_SOURCE,
    gcvFEATURE_PE_DITHER_FIX,
    gcvFEATURE_2D_YUV_SEPARATE_STRIDE,
    gcvFEATURE_FRUSTUM_CLIP_FIX,
    gcvFEATURE_TEXTURE_SWIZZLE,
    gcvFEATURE_PRIMITIVE_RESTART,
    gcvFEATURE_TEXTURE_LINEAR,
    gcvFEATURE_TEXTURE_YUV_ASSEMBLER,
    gcvFEATURE_LINEAR_RENDER_TARGET,
    gcvFEATURE_SHADER_HAS_ATOMIC,
    gcvFEATURE_SHADER_HAS_INSTRUCTION_CACHE,
    gcvFEATURE_SHADER_ENHANCEMENTS2,
    gcvFEATURE_BUG_FIXES7,
    gcvFEATURE_SHADER_HAS_RTNE,
    gcvFEATURE_SHADER_HAS_EXTRA_INSTRUCTIONS2,
    gcvFEATURE_SHADER_ENHANCEMENTS3,
    gcvFEATURE_DYNAMIC_FREQUENCY_SCALING,
    gcvFEATURE_SINGLE_BUFFER,
    gcvFEATURE_OCCLUSION_QUERY,
    gcvFEATURE_2D_GAMMA,
    gcvFEATURE_2D_COLOR_SPACE_CONVERSION,
    gcvFEATURE_2D_SUPER_TILE_VERSION,
    gcvFEATURE_HALTI0,
    gcvFEATURE_HALTI1,
    gcvFEATURE_HALTI2,
    gcvFEATURE_SUPPORT_GCREGTX,
    gcvFEATURE_2D_MIRROR_EXTENSION,
    gcvFEATURE_TEXTURE_ASTC,
    gcvFEATURE_TEXTURE_ASTC_DECODE_FIX,
    gcvFEATURE_TEXTURE_ASTC_BASE_LOD_FIX,
    gcvFEATURE_2D_SUPER_TILE_V1,
    gcvFEATURE_2D_SUPER_TILE_V2,
    gcvFEATURE_2D_SUPER_TILE_V3,
    gcvFEATURE_2D_MULTI_SOURCE_BLT_EX2,
    gcvFEATURE_NEW_RA,
    gcvFEATURE_BUG_FIXED_IMPLICIT_PRIMITIVE_RESTART,
    gcvFEATURE_PE_MULTI_RT_BLEND_ENABLE_CONTROL,
    gcvFEATURE_SMALL_MSAA, /* An upgraded version of Fast MSAA */
    gcvFEATURE_VERTEX_INST_ID_AS_ATTRIBUTE,
    gcvFEATURE_DUAL_16,
    gcvFEATURE_BRANCH_ON_IMMEDIATE_REG,
    gcvFEATURE_2D_COMPRESSION,
    gcvFEATURE_TPC_COMPRESSION,
    gcvFEATURE_TPCV11_COMPRESSION,
    gcvFEATURE_DEC_COMPRESSION,
    gcvFEATURE_DEC300_COMPRESSION,
    gcvFEATURE_DEC400_COMPRESSION,
    /*Its a new core for DEC400 compression*/
    gcvFEATURE_DEC400EX_COMPRESSION,
    gcvFEATURE_DEC_TPC_COMPRESSION,
    gcvFEATURE_DEC_COMPRESSION_TILE_NV12_8BIT,
    gcvFEATURE_DEC_COMPRESSION_TILE_NV12_10BIT,
    gcvFEATURE_2D_OPF_YUV_OUTPUT,
    gcvFEATURE_2D_FILTERBLIT_A8_ALPHA,
    gcvFEATURE_2D_MULTI_SRC_BLT_TO_UNIFIED_DST_RECT,
    gcvFEATURE_2D_MULTI_SRC_BLT_BILINEAR_FILTER,
    gcvFEATURE_2D_MULTI_SRC_BLT_1_5_ENHANCEMENT,
    gcvFEATURE_V2_COMPRESSION_Z16_FIX,
    gcvFEATURE_VERTEX_INST_ID_AS_INTEGER,
    gcvFEATURE_2D_YUV_MODE,
    gcvFEATURE_2D_CACHE_128B256BPERLINE,
    gcvFEATURE_2D_SEPARATE_CACHE,
    gcvFEATURE_2D_MAJOR_SUPER_TILE,
    gcvFEATURE_2D_V4COMPRESSION,
    gcvFEATURE_2D_VMSAA,
    gcvFEATURE_2D_10BIT_OUTPUT_LINEAR,
    gcvFEATURE_2D_YUV420_OUTPUT_LINEAR,
    gcvFEATURE_ACE,
    gcvFEATURE_NO_YUV420_SOURCE,/* unsupported source with three planes */
    gcvFEATURE_COLOR_COMPRESSION,
    gcvFEATURE_32BPP_COMPONENT_TEXTURE_CHANNEL_SWIZZLE,
    gcvFEATURE_64BPP_HW_CLEAR_SUPPORT,
    gcvFEATURE_TX_LERP_PRECISION_FIX,
    gcvFEATURE_COMPRESSION_V2,
    gcvFEATURE_MMU,
    gcvFEATURE_COMPRESSION_V3,
    gcvFEATURE_TX_DECOMPRESSOR,
    gcvFEATURE_MRT_TILE_STATUS_BUFFER,
    gcvFEATURE_COMPRESSION_V1,
    gcvFEATURE_V1_COMPRESSION_Z16_DECOMPRESS_FIX,
    gcvFEATURE_RTT,
    gcvFEATURE_GENERIC_ATTRIB,
    gcvFEATURE_2D_ONE_PASS_FILTER,
    gcvFEATURE_2D_ONE_PASS_FILTER_TAP,
    gcvFEATURE_2D_POST_FLIP,
    gcvFEATURE_2D_PIXEL_ALIGNMENT,
    gcvFEATURE_CORRECT_AUTO_DISABLE_COUNT,
    gcvFEATURE_CORRECT_AUTO_DISABLE_COUNT_WIDTH,
    gcvFEATURE_8K_RT,
    gcvFEATURE_HALTI3,
    gcvFEATURE_EEZ,
    gcvFEATURE_INTEGER_SIGNEXT_FIX,
    gcvFEATURE_PSOUTPUT_MAPPING,
    gcvFEATURE_8K_RT_FIX,
    gcvFEATURE_TX_TILE_STATUS_MAPPING,
    gcvFEATURE_SRGB_RT_SUPPORT,
    gcvFEATURE_TEXTURE_16K,
    gcvFEATURE_PA_FARZCLIPPING_FIX,
    gcvFEATURE_PE_DITHER_COLORMASK_FIX,
    gcvFEATURE_ZSCALE_FIX,
    gcvFEATURE_MULTI_PIXELPIPES,
    gcvFEATURE_PIPE_CL,
    gcvFEATURE_BUG_FIXES18,
    gcvFEATURE_UNIFIED_SAMPLERS,
    gcvFEATURE_CL_PS_WALKER,
    gcvFEATURE_NEW_HZ,
    gcvFEATURE_TX_FRAC_PRECISION_6BIT,
    gcvFEATURE_SH_INSTRUCTION_PREFETCH,
    gcvFEATURE_PROBE,
    gcvFEATURE_SINGLE_PIPE_HALTI1,
    gcvFEATURE_BUG_FIXES8, /* This HW feature is wrong, we can't use this to check integer branch!!!*/
    gcvFEATURE_2D_ALL_QUAD,
    gcvFEATURE_SEPARATE_SRC_DST,
    gcvFEATURE_TX_HOR_ALIGN_SEL,
    gcvFEATURE_HALTI4,
    gcvFEATURE_MRT_FC_FIX,
    gcvFEATURE_TESSELLATION,
    gcvFEATURE_DRAW_INDIRECT,
    gcvFEATURE_COMPUTE_INDIRECT,
    gcvFEATURE_MSAA_TEXTURE,
    gcvFEATURE_STENCIL_TEXTURE,
    gcvFEATURE_S8_ONLY_RENDERING,
    gcvFEATURE_D24S8_SAMPLE_STENCIL,
    gcvFEATURE_ADVANCED_BLEND_MODE_PART0,
    gcvFEATURE_RA_DEPTH_WRITE,
    gcvFEATURE_RS_DS_DOWNSAMPLE_NATIVE_SUPPORT,
    gcvFEATURE_S8_MSAA_COMPRESSION,
    gcvFEATURE_MSAA_FRAGMENT_OPERATION,
    gcvFEATURE_FE_START_VERTEX_SUPPORT,
    gcvFEATURE_DIVISOR_STREAM_ADDR_FIX,
    gcvFEATURE_ZERO_ATTRIB_SUPPORT,
    gcvFEATURE_DANGLING_VERTEX_FIX,
    gcvFEATURE_PE_DISABLE_COLOR_PIPE,
    gcvFEATURE_FE_12bit_stride,
    gcvFEATURE_TX_LOD_GUARDBAND,
    gcvFEATURE_HAS_PRODUCTID,
    gcvFEATURE_INTEGER32_FIX,
    gcvFEATURE_TEXTURE_GATHER,
    gcvFEATURE_IMG_INSTRUCTION,
    gcvFEATURE_HELPER_INVOCATION,
    gcvFEATURE_NO_USER_CSC,
    /* ANDROID_ONLY_REMOVED,remove some non-android features from gc520c:
     *     (1)Monochrome expansion.
     *     (2)Remove 3D compression and keep read tile status and tile input.
     *     (3)ROP2, ROP3, ROP4. Android only needs one solid color as source. Transparency by monochrome mask, pattern mask, src/dst color key, chroma key.
     *     (4)2x2 minor tile.
     *     (5)7 & 9 tap OPF.
     *     (6)User-defined CSC.
     *     (7)MultiSrc walker v1.5.
     *     (8)SuperTile V1.
     *     (9)Big endian.
     */
    gcvFEATURE_ANDROID_ONLY_REMOVED,
    gcvFEATURE_V2_MSAA_COHERENCY_FIX,
    gcvFEATURE_BLOCK_SIZE_16x16,
    gcvFEATURE_TX_SUPPORT_DEC,
    gcvFEATURE_RSBLT_MSAA_DECOMPRESSION,
    gcvFEATURE_TILEFILLER_32TILE_ALIGNED,
    gcvFEATURE_GEOMETRY_SHADER,
    gcvFEATURE_HALTI5,
    gcvFEATURE_PIPELINE_32_ATTRIBUTES,
    gcvFEATURE_USC,
    gcvFEATURE_CUBEMAP_ARRAY,
    gcvFEATURE_TX_DESCRIPTOR,
    gcvFEATURE_SEPARATE_RT_CTRL,
    gcvFEATURE_RENDER_ARRAY,
    gcvFEATURE_BLT_ENGINE,
    gcvFEATURE_TEXTURE_BUFFER,
    gcvFEATURE_GS_SUPPORT_EMIT,
    gcvFEATURE_SAMPLER_BASE_OFFSET,
    gcvFEATURE_IMAGE_OUT_BOUNDARY_FIX,
    gcvFEATURE_TX_BORDER_CLAMP,
    gcvFEATURE_MSAA_SHADING,
    gcvFEATURE_ADVANCED_SH_INST,
    gcvFEATURE_LOD_FIX_FOR_BASELEVEL,
    gcvFEATURE_MULTIDRAW_INDIRECT,
    gcvFEATURE_DRAW_ELEMENTS_BASE_VERTEX,
    gcvFEATURE_NEW_STEERING_AND_ICACHE_FLUSH, /* Steering base on register base. Trigger-style Icache flush state. */
    gcvFEATURE_PE_DITHER_FIX2,
    gcvFEATURE_INDEX_FETCH_FIX,
    gcvFEATURE_TEX_BASELOD,
    gcvFEATURE_TEX_SEAMLESS_CUBE,
    gcvFEATURE_TEX_ETC2,
    gcvFEATURE_TEX_CUBE_BORDER_LOD,
    gcvFEATURE_FE_ALLOW_STALL_PREFETCH_ENG,
    gcvFEATURE_TX_8BPP_TS_FIX,
    gcvFEATURE_HW_TFB,
    gcvFEATURE_HW_TFB_PERF_FIX,
    gcvFEATURE_COMPRESSION_V4,
    gcvFEATURE_FENCE_32BIT,
    gcvFEATURE_FENCE_64BIT,
    gcvFEATURE_R8_UNORM,
    gcvFEATURE_TX_DEFAULT_VALUE_FIX,
    gcvFEATURE_TX_8bit_UVFrac,
    gcvFEATURE_TX_MIPFILTER_NONE_FIX,
    gcvFEATURE_MC_STENCIL_CTRL,
    gcvFEATURE_DEPTH_MATH_FIX,
    gcvFEATURE_PE_B2B_PIXEL_FIX,
    gcvFEATURE_TEXTURE_GATHER_OFFSETS,
    gcvFEATURE_TEX_CACHE_FLUSH_FIX,
    gcvFEATURE_WIDELINE_HELPER_FIX,
    gcvFEATURE_LINE_DIAMOND_RULE_FIX,
    gcvFEATURE_MULTIGPU_SYNC_V2,
    gcvFEATURE_DRAW_ID,
    gcvFEATURE_SNAPPAGE_CMD,
    gcvFEATURE_COMMAND_PREFETCH,
    gcvFEATURE_SAMPLEPOS_SWIZZLE_FIX,
    gcvFEATURE_SELECTMAP_SRC0_SWIZZLE_FIX,
    gcvFEATURE_LOADATTR_OOB_FIX,
    gcvFEATURE_RA_DEPTH_WRITE_MSAA1X_FIX,
    gcvFEATURE_MRT_8BIT_DUAL_PIPE_FIX,
    gcvFEATURE_BUG_FIXES1,
    gcvFEATURE_MULTI_SOURCE_BLT,
    gcvFEATURE_ZCOMPRESSION,
    gcvFEATURE_DITHER_AND_FILTER_PLUS_ALPHA_2D,
    gcvFEATURE_ONE_PASS_2D_FILTER,
    gcvFEATURE_TX_FILTER,
    gcvFEATURE_CHIPENABLE_LINK,
    gcvFEATURE_TEXTURE_BIAS_LOD_FIX,
    gcvFEATURE_USE_GL_Z,
    gcvFEATURE_SUPPORT_INTEGER,
    /* PARTLY_SUPPORT_INTEGER_BRANCH:
     *      chips can support all integer types for compare instructions, e.g, CMP, SELECT.
     * FULLLY_SUPPORT_INTEGER_BRANCH:
     *      chips can support all integer types for JMP instruction.
     * If PARTLY_SUPPORT_INTEGER_BRANCH is TRUE but FULLLY_SUPPORT_INTEGER_BRANCH is FALSE,
     * then this chip can only support INT32/UINT32 JMP instruction.
     */
    gcvFEATURE_PARTLY_SUPPORT_INTEGER_BRANCH,
    gcvFEATURE_FULLLY_SUPPORT_INTEGER_BRANCH,
    gcvFEATURE_SUPPORT_INTEGER_ATTRIBUTE,
    gcvFEATURE_SUPPORT_MOVAI,
    gcvFEATURE_NEED_FIX_FOR_CL_X,
    gcvFEATURE_NEED_FIX_FOR_CL_XE,
    gcvFEATURE_HAS_OUTPUT_COUNT_FIX,
    gcvFEATURE_VARYING_PACKING_LIMITATION,
    gcvFEATURE_HIGHP_VARYING_SHIFT,
    gcvFEATURE_BUG_FIXES2,
    gcvFEATURE_64K_L2_CACHE,
    gcvFEATURE_128BTILE,
    gcvFEATURE_ADVANCED_BLEND_OPT,
    gcvFEATURE_SNAPPAGE_CMD_FIX,
    gcvFEATURE_L2_CACHE_FOR_2D_420,
    gcvFEATURE_TILE_STATUS_2BITS,
    gcvFEATURE_EXTRA_SHADER_INSTRUCTIONS0,
    gcvFEATURE_EXTRA_SHADER_INSTRUCTIONS1,
    gcvFEATURE_EXTRA_SHADER_INSTRUCTIONS2,
    gcvFEATURE_MEDIUM_PRECISION,
    gcvFEATURE_FE20_BIT_INDEX,
    gcvFEATURE_BUG_FIXES4,
    gcvFEATURE_BUG_FIXES12,
    gcvFEATURE_VMSAA,
    gcvFEATURE_ROBUST_ATOMIC,
    gcvFEATURE_32F_COLORMASK_FIX,
    gcvFEATURE_NEW_GPIPE,
    gcvFEATURE_RS_NEW_BASEADDR,
    gcvFEATURE_TX_DXT,
    gcvFEATURE_SH_FLAT_INTERPOLATION_DUAL16_FIX,
    gcvFEATURE_EVIS,
    gcvFEATURE_SH_SUPPORT_V4,
    gcvFEATURE_SH_SUPPORT_ALPHA_KILL,
    gcvFEATURE_PE_NO_ALPHA_TEST,
    gcvFEATURE_SH_SNAP2PAGE_MAXPAGES_FIX,
    gcvFEATURE_USC_FULLCACHE_FIX,
    gcvFEATURE_PE_64bit_FENCE_FIX,
    gcvFEATURE_BLT_8bit_256TILE_FC_FIX,
    gcvFEATURE_PE_RGBA16I_FIX,
    gcvFEATURE_BLT_64bpp_MASKED_CLEAR_FIX,
    gcvFEATURE_SH_PSO_MSAA1x_FIX,
    gcvFEATURE_USC_ATOMIC_FIX,
    gcvFEATURE_INDEX_CONST_ON_B0,
    gcvFEATURE_SH_NO_ONECONST_LIMIT,
    gcvFEATURE_EVIS_NO_ABSDIFF,
    gcvFEATURE_EVIS_NO_BITREPLACE,
    gcvFEATURE_EVIS_NO_BOXFILTER,
    gcvFEATURE_EVIS_NO_CORDIAC,
    gcvFEATURE_EVIS_NO_DP32,
    gcvFEATURE_EVIS_NO_FILTER,
    gcvFEATURE_EVIS_NO_IADD,
    gcvFEATURE_EVIS_NO_SELECTADD,
    gcvFEATURE_EVIS_LERP_7OUTPUT,
    gcvFEATURE_EVIS_ACCSQ_8OUTPUT,
    gcvFEATURE_ROBUSTNESS,
    gcvFEATURE_SECURITY,
    gcvFEATURE_TX_YUV_ASSEMBLER_10BIT,
    gcvFEATURE_USC_GOS_ADDR_FIX,
    gcvFEATURE_SUPPORT_MSAA2X,
    gcvFEATURE_TX_DESC_CACHE_CLOCKGATE_FIX,
    gcvFEATURE_TX_INTEGER_COORDINATE,
    gcvFEATURE_PSIO_SAMPLEMASK_IN_R0ZW_FIX,
    gcvFEATURE_MULTI_CORE_BLOCK_SET_CONFIG,
    gcvFEATURE_SH_IMG_LDST_ON_TEMP,
    gcvFEATURE_TX_INTEGER_COORDINATE_V2,
    gcvFEATURE_COMPUTE_ONLY,
    gcvFEATURE_SH_IMG_LDST_CLAMP,
    gcvFEATURE_SH_ICACHE_ALLOC_COUNT_FIX,
    gcvFEATURE_MSAA_OQ_FIX,
    gcvFEATURE_PE_ENHANCEMENTS2,
    gcvFEATURE_PSIO_MSAA_CL_FIX,
    gcvFEATURE_FE_NEED_DUMMYDRAW,
    gcvFEATURE_MULTI_CLUSTER,
    gcvFEATURE_PSIO_INTERLOCK,
    gcvFEATURE_BLIT_COMPRESS_DEST,
    gcvFEATURE_SH_MULTI_WG_PACK,
    gcvFEATURE_FE_ROBUST_FIX,
    gcvFEATURE_TX_ASTC_MULTISLICE_FIX,
    gcvFEATURE_PSIO_DUAL16_32bpc_FIX,
    gcvFEATURE_LS_SUPPORT_PER_COMP_DEPENDENCY,
    gcvFEATURE_COMPRESSION_DEC400,
    gcvFEATURE_SH_TEXLD_U_FIX,
    gcvFEATURE_TX_FLUSH_L1CACHE,
    gcvFEATURE_USC_DEFER_FILL_FIX,
    gcvFEATURE_MC_FCCACHE_BYTEMASK,
    gcvFEATURE_SH_MULTI_WG_PACK_FIX,
    gcvFEATURE_FE_PATCHLIST_FETCH_FIX,
    gcvFEATURE_RA_CG_FIX,
    gcvFEATURE_EVIS_VX2,
    gcvFEATURE_SH_HALF_DEPENDENCY_FIX,
    gcvFEATURE_FE_BASEINSTANCE,
    gcvFEATURE_FE_COMPUREINDIRECT_SKIP_UNIFORM,
    gcvFEATURE_SH_CLOCK_GATE_FIX,
    gcvFEATURE_GPIPE_CLOCK_GATE_FIX,
    gcvFEATURE_TP_ENGINE,
    gcvFEATURE_TX_BORDER_CLAMP_FIX,
    gcvFEATURE_SH_IMAGE_LD_LAST_PIXEL_FIX,
    gcvFEATURE_MULTI_CORE_BLOCK_SET_CONFIG2,
    gcvFEATURE_MULTIGPU_SYNC_V3,
    gcvFEATURE_PE_VMSAA_COVERAGE_CACHE_FIX,
    gcvFEATURE_SECURITY_AHB,
    gcvFEATURE_TX_LERP_LESS_BIT,
    gcvFEATURE_SMALL_BATCH,
    gcvFEATURE_SH_IDIV0_SWZL_EHS,
    gcvFEATURE_SH_CMPLX,
    gcvFEATURE_VIP_V7,
    gcvFEATURE_SH_GM_ENDIAN,
    gcvFEATURE_SH_GM_USC_UNALLOC,
    gcvFEATURE_SH_END_OF_BB,
    gcvFEATURE_ASYNC_BLIT,
    gcvFEATURE_ASYNC_FE_FENCE_FIX,
    gcvFEATURE_PSCS_THROTTLE,
    gcvFEATURE_SEPARATE_LS,
    gcvFEATURE_PA_VARYING_COMPONENT_TOGGLE_FIX,
    gcvFEATURE_TX_MULTISAMPLER_FC_FIX,
    gcvFEATURE_WIDELINE_TRIANGLE_EMU,
    gcvFEATURE_FENCE,
    gcvFEATURE_MCFE,
    gcvFEATURE_NN_INTERLEAVE8,
    gcvFEATURE_TP_REORDER,
    gcvFEATURE_TP_RTNE,
    gcvFEATURE_TP_LRN,
    gcvFEATURE_TP_ROI_POOLING,
    gcvFEATURE_TP_MAX_POOLING_STRIDE1,
    gcvFEATURE_NN_BRICK_MODE,
    gcvFEATURE_NN_BORDER_MODE,
    gcvFEATURE_NN_FP16_ALU,
    gcvFEATURE_NN_BF16_ALU,
    gcvFEATURE_NN_INT16_ALU,
    gcvFEATURE_NN_ZDP3,
    gcvFEATURE_NN_ZDP6,
    gcvFEATURE_PE_DEPTH_ONLY_OQFIX,
    gcvFEATURE_TX_SNORM_SUPPORT,
    gcvFEATURE_HWMANAGED_LS,
    gcvFEATURE_SH_SCATTER_GATHER,
    gcvFEATURE_NN_POWER_ISOLATION,
    gcvFEATURE_SWTILING_PHASE1,
    gcvFEATURE_SWTILING_PHASE2,
    gcvFEATURE_SWTILING_PHASE3,
    gcvFEATURE_TF_QUANTIZATION,
    gcvFEATURE_NN_XYDP9,
    gcvFEATURE_TP_SIMPLE_INT16,
    gcvFEATURE_TP_REAL_INT16,
    gcvFEATURE_NN_FIRST_PIXEL_POOLING,
    gcvFEATURE_NN_STRIDE_SUPPORT,
    gcvFEATURE_NN_XYDP6,
    gcvFEATURE_NN_XYDP0,
    gcvFEATURE_TP_REORDER_FIX,
    gcvFEATURE_NN_CONV1x1_PERF_FIX,
    gcvFEATURE_NN_CACHELINE_MODE_PERF_FIX,
    gcvFEATURE_NN_PER3DTILE_BUBBLE_FIX,
    gcvFEATURE_SH_IO_CG_FIX,
    gcvFEATURE_USC_STAY_LRU,
    gcvFEATURE_NN_NONZERO_MIRROR_BORDER,
    gcvFEATURE_NN_COEF_DECOMPRESS_PERF2X,
    gcvFEATURE_4BIT_INPUT,
    gcvFEATURE_COEF_COMPRESSION_ENHANCEMENT,
    gcvFEATURE_NN_ZDP3_NO_COMPRESS_FIX,
    gcvFEATURE_NN_ASYNC_COPY_PERF_FIX,
    gcvFEATURE_OCB_COUNTER,
    gcvFEATURE_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX,
    gcvFEATURE_NN_FULLCACHE_KERNEL_INTERLEAVE_FIX,
    gcvFEATURE_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX,
    gcvFEATURE_USC_BOTTLENECK_FIX,
    gcvFEATURE_OCB_REMAP_PHYSICAL_ADDRESS,
    gcvFEATURE_BIT_NN_HW_LIMITATION_NATIVE_KER_1x2_2x1,
    gcvFEATURE_NN_SLICE_PADDING_TO_64BYTE_ALIGN,
    gcvFEATURE_NN_DW_1x1_CONV_MERGE,
    gcvFEATURE_TP_REORDER_LAYER_SUSPEND_FIX,
    gcvFEATURE_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX,
    gcvFEATURE_IMG_POP_PIPELINE_PAUSE_FIX,
    gcvFEATURE_NN_SLOW_OUTPUT,
    gcvFEATURE_NO_NARROW_POST_PROCESS_PIPE,
    gcvFEATURE_TP_NN_PROBE,
    gcvFEATURE_TP_23BITS_POST_MULTIPLIER,
    gcvFEATURE_NN_TRANSPOSE,
    gcvFEATURE_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX,
    gcvFEATURE_TP_BFLOAT16,
    gcvFEATURE_EVIS2_FLOP_RESET_FIX,
    gcvFEATURE_USC_ASYNC_CP_RTN_FLOP_RESET_FIX,
    gcvFEATURE_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX,
    gcvFEATURE_NEGATIVE_POST_SHIFT_FIX,
    gcvFEATURE_NN_COMMAND_KERNEL_REQUEST_CONFICT_FIX,
    gcvFEATURE_NN_LEAKY_RELU,
    gcvFEATURE_NN_PRELU,
    gcvFEATURE_NN_NATIVE_STRIDE_TWO,
    gcvFEATURE_BIT_NN_SUPPORT_CONV1x1_AND_NATIVE_CONV_STRIDE2,
    gcvFEATURE_NN_TENSOR_ADD,

    gcvFEATURE_IMAGE_LS_NO_FULLMASK_FIX,
    gcvFEATURE_BLT_YUV_OUTPUT,
    gcvFEATURE_PE_TILE_CACHE_FLUSH_FIX,
    gcvFEATURE_SH_ROBUSTNESS_FIX,
    gcvFEATURE_USC_ATOMIC_FIX2,
    gcvFEATURE_MULTIVIEW_RENDER,
    gcvFEATURE_FE_DRAW_DIRECT,
    gcvFEATURE_TX_VKBORDER_MODE,
    gcvFEATURE_TX_UNNORMALIZED_COORD,
    gcvFEATURE_VG_IMAGE_16K,
    gcvFEATURE_MULTICORE_CONFIG,
    gcvFEATURE_PA_LINECLIP_FIX,
    gcvFEATURE_NN_ENGINE,
    gcvFEATURE_NN_ASYNC_COPY_MERGE_FIX,
    gcvFEATURE_NN_CONVOUT_FIFO_DEPTH_FIX,
    gcvFEATURE_NN_SMALLBATCH_PHASE1,
    gcvFEATURE_TP_SMALLBATCH_PHASE1,
    gcvFEATURE_VIP_SCALER,
    gcvFEATURE_VIP_SCALER_4K,
    gcvFEATURE_TX_8bit_UVFrac_ROUNDING_FIX,
    gcvFEATURE_NN_REQ_SLOWARBITRATION_FIX,
    gcvFEATUER_IMAGE_PARTIAL_CACHE,
    gcvFEATURE_FULLCACHE_KERNELHEAD_FIX,
    gcvFEATURE_NN_SINGLEPORT_ACCUMBUFFER,
    gcvFEATURE_NN_SMALLBATCH,
    gcvFEATURE_TP_SMALLBATCH,
    gcvFEATURE_NN_ZDP_INIMAGE_SIZE_FIX,
    gcvFEATURE_HI_REORDER_FIX,
    gcvFEATURE_TP_COEF_COMPRESSION_ENHANCEMENT,
    gcvFEATURE_NN_DEPTHWISE_SUPPORT,
    gcvFEATURE_IMAGE_NOT_PACKED_IN_SRAM_FIX,
    gcvFEATURE_IDLE_BEFORE_FLUSH_COMPLETE_FIX,
    gcvFEATURE_NO_FLUSH_USC_FIX,
    gcvFEATURE_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX,
    gcvFEATURE_XY_OFFSET_LIMITATION_FIX,
    gcvFEATURE_USC_INVALIDATE_CACHE_LINE_FIX,
    gcvFEATURE_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX,
    gcvFEATURE_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX,
    gcvFEATURE_NN_PER_CHANNEL_QUANT,
    gcvFEATURE_NN_NO_Z_LOCATION_OFFSET,
    gcvFEATURE_NN_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX,
    gcvFEATURE_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX,
    gcvFEATURE_VIP_DEC400,
    gcvFEATURE_MAX_POINTSIZE_CLAMP,
    gcvFEATURE_2D_FAST_CLEAR, /* For tilestatus Fast Clear feature*/
    gcvFEATURE_NN_PER_CHANNEL_QUANT_ASYM,
    gcvFEATURE_SMALL_BATCH_FLOPS_RESET_FIX,
    gcvFEATURE_SMALL_BATCH_DISBLE_FIX,
    gcvFEATURE_FORMAT_10BIT_CROSS_4K,
    gcvFEATURE_ENDIAN_CONTROL,
    gcvFEATURE_SH_VX2_FLOATING_MAD_FIX,
    gcvFEATURE_PE_A8B8G8R8, /* For PE support A8B8G8R8 format feature*/
    gcvFEATURE_DEPTHWISE_NEIGHBOR_IMG_DATA_TRANSFER_NOT_EFFICIENT_FIX,

    /* FP16 enhancement-related features. */
    gcvFEATURE_DST_TEX_I2F_F2I_INST_DEPRECATE,
    gcvFEATURE_ALU_FP16_INST_SUPPORT,
    gcvFEATURE_DUAL16_14BIT_PC_SUPPORT,
    gcvFEATURE_LDST_CONV_4ROUNDING_MODES,
    gcvFEATURE_FULL_PACK_MODE_SUPPORT,
    gcvFEATURE_FP32_TO_FP16_CONV_FIX,

    gcvFEATURE_SH_HAS_IMGLD_COMP_COUNT_FIX,
    gcvFEATURE_SH_SUPPORT_FP32_FMA,

    gcvFEATURE_SH_SUPPORT_VEC2_INT_MULMAD,
    gcvFEATURE_SH_SUPPORT_VEC4_INT_MULMAD,

    gcvFEATURE_SH_SUPPORT_HIGHPVEC_FORMAT,
    gcvFEATURE_SH_HAS_32BIT_NEG_OFFSET_FIX_FOR_40BIT_VA,
    gcvFEATURE_SH_SUPPORT_AIGM,
    gcvFEATURE_SH_CS_PAGE_SIZE_ISSUE,
    gcvFEATURE_SH_INTEGER_FRONT_FACE,
    gcvFEATURE_SH_SUPPORT_MULTIVIEWPORT,

    gcvFEATURE_SH_PER_STAGE_LOCAL_STORAGE,
    gcvFEATURE_SH_SUPPORT_SEPARATED_TEX,
    gcvFEATURE_SH_SUPPORT_CLIP_CULL_DISTANCE,
    gcvFEATURE_SH_D3D11_SUPPORT,

    gcvFEATURE_SH_DYNAMIC_TEXTURE_INDEXING,

    /* AIGPU feature. */
    gcvFEATURE_AI_GPU,
    gcvFEATURE_NN_FAST_FIRST_PIXEL_POOLING,
    gcvFEATURE_NN_FLOAT_POST_MULT,
    gcvFEATURE_NN_ASYMMETRIC_INT8,

    gcvFEATURE_FORMAT_YUV_I010, /*support YUVI010 & P010_LSB format*/
    gcvFEATURE_FORMAT_YUV420_101010, /*support YUV420_101010 format*/
    gcvFEATURE_FORMAT_FLOATPOINT, /*support FloatPoint format,also include packed-RGB888*/

    gcvFEATURE_BIT_NN_COMPRESSION_BYPASSS,
    gcvFEATURE_BIT_BFLOAT_COEF_COMPRESSION_ZERO_COEFBIT14_INVERSE,
    gcvFEATURE_BIT_TP_KERNEL_1BYTE_ALGIN,
    gcvFEATURE_PREPROCESS_IMG_BUF_640BYTE_LIMIT,
    gcvFEATURE_BIT_TPLITE_BFLOAT16,
    gcvFEATURE_VIP_HW_FINAL_RELEASE,
    gcvFEATURE_OUTPUT_CONVERT_UINT8_INT8_TO_UINT16_INT16_FIX,
    gcvFEATURE_IMG_ADDR_NOT_WRAP_IF_OVER_OCB_ADDR_FIX, /* 2089 */
    gcvFEATURE_BIT_V8_SINGLE_PORT_ACCUMULATION_BUFFER_RW_CONFICT_ZERO_SKIP_PERF_FIX, /* 2043 */
    gcvFEATURE_BIT_BURST_COLLECT_DUMMY_DATA_WASTE_CYCLES_FIX, /* 2111 */
    gcvFEATURE_BIT_TP_ACCESS_VIPSRAM_OT_IS_ONE_FIX, /* 2050 */

    gcvFEATURE_BIT_USE_SINGLE_PORT_VIPSRAM,
    gcvFEATURE_VALUE_DDR_KERNEL_BURST_SIZE,
    gcvFEATURE_BIT_TILE_ACCESS_CAPABILITY,
    gcvFEATURE_BIT_FAST_DP3_PREPROCESSOR,

    gcvFEATURE_BIT_INIMG_NOT_64BYTE_ALIGN_CACHELINE_MODE_FIX, /* 2112 */
    gcvFEATURE_BIT_DEPTHWISE_16BIT_FORMAT,

    gcvFEATURE_2D_TILESTATUS_ROTATION, /*Fix fastclear feature with rotation*/
    gcvFEATURE_BIT_TP_FC_FLOAT_LAST_PIXEL_NEGATIVE_0_FIX,
    gcvFEATURE_TS_FC_VULKAN_SUPPORT,
    gcvFEATURE_BIT_V8_ACCUMLATION_READ_OUT_HAS_BUBBLES_PERF_FIX, /* 2044 */
    gcvFEATURE_BIT_MAX_TILE_SIZE,
    gcvFEATURE_2D_TARGET_MAJOR_SUPER_TILE, /*target support supertile Y major*/
    gcvFEATURE_BIT_INIMAGE_2DTILE_NOT_LESS_160PIXEL_FIX,
    gcvFEATURE_BIT_NN_IN_TILE_DATA_IS_ALL_PAD_FIX, /* 2131 */
    gcvFEATURE_BIT_US_SRAM_READ_INTF_FIFO_OVERFLOW_FIX, /* 2280 */

    /* TP reorder the int tile x should be less than 512 */
    gcvFEATURE_TP_REORDER_INTILE_X_SIZE_512_FIX,
    gcvFEATURE_NN_WASTE_COEF_READ_WRITE_BANDWIDTH_128BYTE_VIPSRAM_IN_FULL_PATIAL_CACHE_MODE_FIX,
    gcvFEATURE_BIT_BFP_COEF_AUTO_PAD_INCOMPLETE_ZERO_IN_KZ_PLANE,
    gcvFEATURE_NN_FLOAT32_IO,
    gcvFEATURE_TP_FLOAT32_IO,
    /* add for support INT16x(U)INT8 */
    gcvFEATURE_BIT_NN_23BITS_POST_MULTIPLIER_VIP_V7,
    gcvFEATURE_BIT_TP_23BITS_POST_MULTIPLIER_VIP_V7,
    gcvFEATURE_CONV_INT16X8BIT_VIP_V7,

    /* Q channel support. */
    gcvFEATURE_Q_CHANNEL_SUPPORT,

    /* MMU descriptor new refinement. */
    gcvFEATURE_MMU_PAGE_DESCRIPTOR,

    gcvFEATURE_BIT_NN_TILE_NUM_BIGGER_THAN_1024_FIX,

    gcvFEATURE_BIT_HI1_L2_CACHE,

    gcvFEATURE_BIT_NN_SUPPORT_CONV_1D,

    gcvFEATURE_BIT_NN_DEPTHWISE_AFTER_16BIT_LAYER_LIMIT_FIX,

    /* only support gcvSURF_B8G8R8_PLANAR & gcvSURF_AYUV format as target */
    gcvFEATURE_BIT_BGR_PLANAR,

    gcvFEATURE_BIT_USC_INDIVIDUAL_PORT_WRT_EARLY_EVICT_DATA_CORRUPT_FIX,
    gcvFEATURE_BIT_NN_TP_INSTR_COMPLETE_IN_SAME_CYCLE_WITH_WAIT_EVENT_FIX,

    gcvFEATURE_BIT_TP_SOFTMAX,
    gcvFEATURE_TP_TENSOR_ADD_MUL,

    gcvFEATURE_NN_REMOVE_POOLING,
    gcvFEATURE_BIT_NN_DEPTHWISE_INT16XINT8,
    gcvFEATURE_BIT_NN_DEPTHWISE_8BIT_VIP_V7,
    gcvFEATURE_BIT_NN_ZDP_TRANSPOSE_CH9_ONLY,
    gcvFEATURE_BIT_NN_SUPPORT_DUMMY_TILE,
    gcvFEATURE_BIT_USE_VIPSRAM_FOR_KERNEL_STREAMING,
    gcvFEATURE_BIT_NN_SUPPORT_KERNEL_1BYTE_ALIGN,
    gcvFEATURE_BIT_NN_SMALL_BATCH_PHASE2,
    gcvFEATURE_SH_MOVAI_MOVAR_UNUSED_COMPONENTS_WRITE_DIRTY_DATA_FIX,
    gcvFEATURE_BIT_NN_ENHANCED_MAX_POOLING,
    gcvFEATURE_NN_1x1_NON_POOLING_PACKING,
    gcvFEATURE_BIT_NN_SUPPORT_BOTH_CONV_NATIVE_STRIDE2_AND_POOLING,
    gcvFEATURE_BIT_NN_SUPPORT_ALU,
    gcvFEATURE_BIT_NN_TRANSPOSE_PHASE2,
    gcvFEATURE_BIT_NN_FC_ENHANCEMENT,
    gcvFEATURE_BIT_NN_2ND_IMG_BASE_ADDR_FIX,
    gcvFEATURE_BIT_NN_TENSOR_ADD_FIELD_MOVE_TO_EXT_CMD,

    gcvFEATURE_IMGLD_WIDTH_LT16_FIX,
    gcvFEATURE_BIT_GPU_INSPECTOR_COUNTERS,

    gcvFEATURE_VIP_REMOVE_MMU,
    gcvFEATURE_BIT_TPLITE_SUPPORT_TP_DATA_TRANSPOSE,
    gcvFEATURE_BIT_NN_JD_DIRECT_MODE_FIX,
    gcvFEATURE_BIT_NN_CONV_CORE_BYPASS,
    gcvFEATURE_BIT_TP_REMOVE_FC,

    gcvFEATURE_BIT_HI_DEFAULT_ENABLE_REORDER_FIX,
    gcvFEATURE_BIT_NN_TENSOR_ADD_RELU,
    gcvFEATURE_BIT_NN_VIPSRAM_DOUBLE_BUFFER_FIX,

    gcvFEATURE_BIT_NN_POST_OUT_SUPPORT_FP16,
    gcvFEATURE_BIT_NN_POST_OUT_SUPPORT_BF16,
    gcvFEATURE_BIT_NN_POST_OUT_SUPPORT_FP32,
    gcvFEATURE_BIT_NN_POST_OUT_SUPPORT_INT32,
    gcvFEATURE_BIT_DEPTHWISE_FLOAT_FIX,

    /*
     * Using event 28 as frame done interrupt, set by End command with bit 28
     * interrupt enabled by AHB 0x14 register and clear by 0x10 register.
     */
    gcvFEATURE_2D_FRAME_DONE_INTR,
    gcvFEATURE_BIT_NN_BURST_COLLECTER_LAST_FLAG_FIX,
    gcvFEATURE_BIT_NN_POST_MULT_SUPPORT_FP_CONV,

    /*
     * support AXI Front-End hardware moudle for IP (subsystem) directly interfacing
     * to SOC through AXI port.
     */
    gcvFEATURE_BIT_AXI_FE,
    gcvFEATURE_BIT_V83_1ST_CACHE_MODE_VIPSRAM_RD_UPDATE_FIX,
    gcvFEATURE_BIT_NN_KERNEL_MSS_SBP2_DIRECT_STEAM_STEAM_FIX,
    gcvFEATURE_BIT_NN_RD_IMG_NEED_EXTRA_SPACE,
    gcvFEATURE_BIT_V83_NUMOFPENDINGTILES_FOR_2NDIMAGE_FIX,
    gcvFEATURE_BIT_CORE_NUM_OF_KID_FOR_MULTI_LAYER_FIX,
    gcvFEATURE_BIT_USC_RW_SAME_CACHELINE_UPDATE_FIX,
    gcvFEATURE_BIT_V83_1ST_KERNEL_STREAM_BUFFER_UPDATE_FIX,
    gcvFEATURE_BIT_NN_CMD_SUPPORT_SLICE,
    gcvFEATURE_BIT_NN_HW_V83,

    /* ANDROID_ONLY_RESERVED,reserve some non-android features:
     *     (1)Line drawing,
     *     (2)8x8 pattern,
     *     (3)Index8 format,
     *     (4)Demultiply,
     *     (5)Alpha blending:(ONE,ONE_MINUS_SRC_ALPHA),(SRC_ALPHA,ONE_MINUS_SRC_ALPHA),global alpha and pre-multiply,
     *     (6)Rectangle clear and fill,
     *     (7)Rotation.Android uses'90 deg','H flip','V flip'three bits to describe 8 transformations.
     */
    gcvFEATURE_ANDROID_ONLY_RESERVED,
    gcvFEATURE_2D_MULTISOURCE_PIPE, /* move bitblit/stretchblit pipe line to multisource blit */
    gcvFEATURE_2D_MASK_AND_COLORKEY, /* maskblit and src/dst color key */

    gcvFEATURE_BIT_V83_INTILESIZE_1X1_10BITS_FIX,
    gcvFEATURE_BIT_NN_CIRCULAR_BUF_WRAP_ADDRESS_OVERFLOW_FIX,
    gcvFEATURE_BIT_TP_CIRCULAR_BUF_WRAP_ADDRESS_OVERFLOW_FIX,
    gcvFEATURE_BIT_TP_CIRCULAR_BUF_WRAP_ADDRESS_LESS_FIX,
    gcvFEATURE_BIT_USC_PAUSE_TP_WR_REQ_MORE_THAN_256_CYCLES_FIX,

    gcvFEATURE_BIT_TP_SPECIAL_LIST_PARSER_FIX, /* 2365 */

    gcvFEATURE_2D_STRETCH_MULTISOURCE_PIPE, /* move stretchblit pipe line to multisource blit */

    gcvFEATURE_BIT_PA_ZEROAREA_LINE_FIX, /* HW 2380 */
    gcvFEATURE_BIT_RS_TILER_YUV420_FIX, /* HW 2114 */

    gcvFEATURE_BIT_NN_JOB_CANCELATION,

    gcvFEATURE_BIT_V8_DIRECT_MODE_START_ADDR_BIAS_FOR_NEGATIVE_OFFSET_FIX,

    /* only support gcvSURF_B8G8R8_PLANAR & gcvSURF_AYUV format as source */
    gcvFEATURE_BIT_BGR_PLANAR_SOURCE,

    gcvFEATURE_2D_FC_IN_DEC400EX,/* 2D Fast Clear support in DEC400EX */
    gcvFEATURE_BIT_DIRECT_INIMAGE_XSTIDE_LE_13BIT_FIX,
    gcvFEATURE_BIT_PE_64BPP_LINEAR_FORMAT,
    gcvFEATURE_BIT_NN_SUPPORT_MULTI_AXI_ID,
    gcvFEATURE_BIT_NN_STREAM_PROCESSOR,
    gcvFEATURE_BIT_TRSPB2_ENDADDR_EQUAL_SRAMEND_FIX,

    /* Feature about normalization */
    gcvFEATURE_2D_NORMALIZATION,
    gcvFEATURE_2D_NORMALIZATION_QUANTIZATION,

    gcvFEATURE_BIT_NN_SUPPORT_16_8_QUANTIZATION,
    gcvFEATURE_BIT_SPECIAL_8BIT_SIGN_ABS_CONV,
    gcvFEATURE_BIT_VIP_SUPPORT_TENSOR_TRANSFER,
    gcvFEATURE_BIT_NN_SUPPORT_CMD_LOOP,

    gcvFEATURE_BIT_NN_1ST_AND_2ND_INIMAGE_RAISE_VIPSRAM_RD_UPDATE_AT_SAME_TIME_FIX,
    gcvFEATURE_BIT_NN_1ST_AND_2ND_INIMAGE_RAISE_VIPSRAM_RD_UPDATE_AT_SAME_TIME_PHASE1_FIX,
    gcvFEATURE_BIT_NN_1ST_AND_2ND_INIMAGE_RAISE_VIPSRAM_RD_UPDATE_AT_SAME_TIME_PHASE2_FIX,
    gcvFEATURE_BIT_SECONDIMG_TILE_SIDEBANFIFO_FIX,

    gcvFEATURE_BIT_NN_4BIT_PHASE1,
    gcvFEATURE_BIT_NN_SUPPORT_DECONVNxN_S_LESS_THAN_16,
    gcvFEATURE_BIT_NN_PICOCORE_DEPTHWISE,
    gcvFEATURE_BIT_NN_SINGLE_POSTMULT_FIELDS_IN_BITSTREAM,
    gcvFEATURE_VALUE_NN_SMALL_ACCUM_BITS,
    gcvFEATURE_VALUE_NN_SMALL_ACCUM,
    gcvFEATURE_BIT_VIP_SUPPORT_X_FRAME_COMPRESSION,
    gcvFEATURE_NN_SUPPORT_EFUSE,
    gcvFEATURE_BIT_NN_WRITE_WITHOUT_USC,
    gcvFEATURE_BIT_NN_SUPPORT_CONFIGURABLE_FASTXDP3,
    gcvFEATURE_BIT_SH_SUPPORT_VEC2,
    gcvFEATURE_BIT_KERNEL_WR_RD_LUTLOAD_DIRECTMODE_ADDR_FIX,
    gcvFEATURE_VALUE_NN_COEF_DECOMPRESS_PERF_X,
    gcvFEATURE_BIT_VZ_GROUP_START_Z_OVERFLOW_FIX,
    gcvFEATURE_BIT_NN_SPLIT_X_AMONG_CLUSTE,
    gcvFEATURE_BIT_SRAM_PARITY,
    gcvFEATURE_BIT_TRSP2_CONV_SMALLBATCH_FIX,
    gcvFEATURE_BIT_NN_SUPPORT_GEMM_PHASE1,
    gcvFEATURE_BIT_NN_SUPPORT_GEMM_PHASE2,
    gcvFEATURE_NN_TENSOR_ADD_INT16,
    gcvFEATURE_BIT_DEPTHTOSPACE_SAME_XY_FIX,
    gcvFEATURE_BIT_NN_SUPPORT_ZDP_LOOP6,
    gcvFEATURE_NN_ELEMENTWISE_BROADCAST,
    gcvFEATURE_NN_2ND_IMAGE_DATA_TYPE,
    gcvFEATURE_BIT_FP_INIMAGE_POST_SCALE,
    gcvFEATURE_BIT_FASTXDP3_ONLY_IN_DEPTHWISE_FIX,
    gcvFEATURE_BIT_NN_TILE_YSIZE_127_LIMITATION_FIX,
    gcvFEATURE_BIT_NN_2ND_IMG_SMALL_3D_TILE_FIX,
    gcvFEATURE_BIT_NN_CONV_1D_16BIT_FORMAT_INTILE_SIZE_LIMITATION_FIX,
    gcvFEATURE_BIT_PERF_KERNEL_DESCRIPTOR_SOURCE_FIX,

    /* Insert features above this comment only. */
    gcvFEATURE_COUNT                /* Not a feature. */
} gceFEATURE;

/* Chip Power Status. */
typedef enum _gceCHIPPOWERSTATE {
    gcvPOWER_INVALID = -1,

    /* Global/base states. */
    gcvPOWER_ON = 0,
    gcvPOWER_IDLE,
    gcvPOWER_SUSPEND,
    gcvPOWER_OFF,

    /* Power on but not global or broadcast. */
    gcvPOWER_ON_AUTO,

    /* Broadcast states. */
    gcvPOWER_FLAG_BROADCAST    = 0x10,
    gcvPOWER_IDLE_BROADCAST    = gcvPOWER_IDLE    | gcvPOWER_FLAG_BROADCAST,
    gcvPOWER_SUSPEND_BROADCAST = gcvPOWER_SUSPEND | gcvPOWER_FLAG_BROADCAST,
    gcvPOWER_OFF_BROADCAST     = gcvPOWER_OFF     | gcvPOWER_FLAG_BROADCAST,

    /* Timeout states. */
    gcvPOWER_FLAG_TIMEOUT      = 0x20,
    gcvPOWER_IDLE_TIMEOUT      = gcvPOWER_IDLE    | gcvPOWER_FLAG_TIMEOUT,
    gcvPOWER_SUSPEND_TIMEOUT   = gcvPOWER_SUSPEND | gcvPOWER_FLAG_TIMEOUT,
    gcvPOWER_OFF_TIMEOUT       = gcvPOWER_OFF     | gcvPOWER_FLAG_TIMEOUT,

} gceCHIPPOWERSTATE;

/* CPU cache operations */
typedef enum _gceCACHEOPERATION {
    gcvCACHE_CLEAN      = 0x01, /* Flush CPU cache to mem */
    gcvCACHE_INVALIDATE = 0x02, /* Invalidte CPU cache */
    gcvCACHE_FLUSH      = gcvCACHE_CLEAN  | gcvCACHE_INVALIDATE, /* Both flush & invalidate */
    gcvCACHE_MEMORY_BARRIER = 0x04
} gceCACHEOPERATION;

/* Surface types. */
typedef enum _gceSURF_TYPE {
    gcvSURF_TYPE_UNKNOWN = 0,
    gcvSURF_INDEX,
    gcvSURF_VERTEX,
    gcvSURF_TEXTURE,
    gcvSURF_RENDER_TARGET,
    gcvSURF_DEPTH,
    gcvSURF_BITMAP,
    gcvSURF_TILE_STATUS,
    gcvSURF_IMAGE,
    gcvSURF_MASK,
    gcvSURF_SCISSOR,
    gcvSURF_HIERARCHICAL_DEPTH,
    gcvSURF_ICACHE,
    gcvSURF_TXDESC,
    gcvSURF_FENCE,
    gcvSURF_TFBHEADER,
    gcvSURF_NUM_TYPES, /* Make sure this is the last one! */

    /* Combinations. */
    gcvSURF_NO_TILE_STATUS          = 0x100,
    gcvSURF_NO_VIDMEM               = 0x200, /* Used to allocate surfaces with no underlying vidmem node.
                                                  * In Android, vidmem node is allocated by another process.
                                                  */
    gcvSURF_CACHEABLE               = 0x400, /* Used to allocate a cacheable surface */
    gcvSURF_TILE_RLV_FENCE          = 0x800, /* create texture fence as tile */
    gcvSURF_TILE_STATUS_DIRTY       = 0x1000, /* Init tile status to all dirty */
    gcvSURF_LINEAR                  = 0x2000,
    gcvSURF_CREATE_AS_TEXTURE       = 0x4000, /* create it as a texture */
    gcvSURF_PROTECTED_CONTENT       = 0x8000, /* create it as content protected */
    gcvSURF_CREATE_AS_DISPLAYBUFFER = 0x10000, /*create it as a display buffer surface */
    gcvSURF_CONTIGUOUS              = 0x20000, /*create it as contiguous */
    gcvSURF_NO_COMPRESSION          = 0x40000, /* Create it as no compression, valid on when it has tile status. */
    gcvSURF_DEC                     = 0x80000, /* Surface is DEC compressed */
    gcvSURF_NO_HZ                   = 0x100000,
    gcvSURF_3D                      = 0x200000, /* It's 3d surface */
    gcvSURF_DMABUF_EXPORTABLE       = 0x400000, /* master node can be exported as dma-buf fd */
    gcvSURF_CACHE_MODE_128          = 0x800000,
    gcvSURF_TILED                   = 0x1000000, /* force create tile buffer, as we will convert it to supertile according to related hardware feature by default */
    gcvSURF_FORCE_32BIT_VA          = 0x2000000, /* force allocate 32bit VA */
    gcvSURF_LINEAR_NO_ALIGNMENT     = 0x4000000, /* only for linear render target buffer */

    gcvSURF_TEXTURE_LINEAR               = gcvSURF_TEXTURE
                                         | gcvSURF_LINEAR,

    gcvSURF_RENDER_TARGET_LINEAR         = gcvSURF_RENDER_TARGET
                                         | gcvSURF_LINEAR,

    gcvSURF_RENDER_TARGET_NO_TILE_STATUS = gcvSURF_RENDER_TARGET
                                         | gcvSURF_NO_TILE_STATUS,

    gcvSURF_RENDER_TARGET_NO_COMPRESSION = gcvSURF_RENDER_TARGET
                                         | gcvSURF_NO_COMPRESSION,

    gcvSURF_RENDER_TARGET_TS_DIRTY       = gcvSURF_RENDER_TARGET
                                         | gcvSURF_TILE_STATUS_DIRTY,

    gcvSURF_DEPTH_NO_TILE_STATUS         = gcvSURF_DEPTH
                                         | gcvSURF_NO_TILE_STATUS,

    gcvSURF_DEPTH_TS_DIRTY               = gcvSURF_DEPTH
                                         | gcvSURF_TILE_STATUS_DIRTY,

    /* Supported surface types with no vidmem node. */
    gcvSURF_BITMAP_NO_VIDMEM             = gcvSURF_BITMAP
                                         | gcvSURF_NO_VIDMEM,

    gcvSURF_TEXTURE_NO_VIDMEM            = gcvSURF_TEXTURE
                                         | gcvSURF_NO_VIDMEM,

    /* Cacheable surface types with no vidmem node. */
    gcvSURF_CACHEABLE_BITMAP_NO_VIDMEM   = gcvSURF_BITMAP_NO_VIDMEM
                                         | gcvSURF_CACHEABLE,

    gcvSURF_CACHEABLE_BITMAP             = gcvSURF_BITMAP
                                         | gcvSURF_CACHEABLE,

    gcvSURF_TEXTURE_3D                  = gcvSURF_TEXTURE
                                         | gcvSURF_3D
} gceSURF_TYPE;

/*
 * Surface formats.
 * Name rules is from MSB->LSB.
 */
typedef enum _gceSURF_FORMAT {
    /* Unknown format. */
    gcvSURF_UNKNOWN             = 0,

    /* Format test */
    gcvSURF_TEST                = 1,

    /* Palettized formats. */
    gcvSURF_INDEX1              = 100,
    gcvSURF_INDEX4,
    gcvSURF_INDEX8,
#if gcdVG_ONLY
    gcvSURF_INDEX2,
#endif

    /* RGB formats. */
    gcvSURF_A2R2G2B2            = 200,
    gcvSURF_R3G3B2,
    gcvSURF_A8R3G3B2,
    gcvSURF_X4R4G4B4,
    gcvSURF_A4R4G4B4,
    gcvSURF_R4G4B4A4,
    gcvSURF_X1R5G5B5,
    gcvSURF_A1R5G5B5,
    gcvSURF_R5G5B5A1,
    gcvSURF_R5G6B5,
    gcvSURF_R8G8B8,
    gcvSURF_X8R8G8B8,
    gcvSURF_A8R8G8B8,
    gcvSURF_R8G8B8A8,
    gcvSURF_G8R8G8B8,
    gcvSURF_R8G8B8G8,
    gcvSURF_X2R10G10B10,
    gcvSURF_A2R10G10B10,
    gcvSURF_R10G10B10A2,
    gcvSURF_X12R12G12B12,
    gcvSURF_A12R12G12B12,
    gcvSURF_X16R16G16B16,
    gcvSURF_A16R16G16B16,
    gcvSURF_A32R32G32B32,
    gcvSURF_R8G8B8X8,
    gcvSURF_R5G5B5X1,
    gcvSURF_R4G4B4X4,
    gcvSURF_X16R16G16B16_2_A8R8G8B8,
    gcvSURF_A16R16G16B16_2_A8R8G8B8,
    gcvSURF_A32R32G32B32_2_G32R32F,
    gcvSURF_A32R32G32B32_4_A8R8G8B8,
    gcvSURF_R8G8B8_PLANAR,
    gcvSURF_R8G8B8I,
    gcvSURF_R8G8B8I_PLANAR,
    gcvSURF_R16G16B16I,
    gcvSURF_R16G16B16I_PLANAR,

    /* BGR formats. */
    gcvSURF_A4B4G4R4            = 300,
    gcvSURF_A1B5G5R5,
    gcvSURF_B5G6R5,
    gcvSURF_B8G8R8,
    gcvSURF_B16G16R16,
    gcvSURF_X8B8G8R8,
    gcvSURF_A8B8G8R8,
    gcvSURF_A2B10G10R10,
    gcvSURF_X16B16G16R16,
    gcvSURF_A16B16G16R16,
    gcvSURF_B32G32R32,
    gcvSURF_X32B32G32R32,
    gcvSURF_A32B32G32R32,
    gcvSURF_B4G4R4A4,
    gcvSURF_B5G5R5A1,
    gcvSURF_B8G8R8X8,
    gcvSURF_B8G8R8A8,
    gcvSURF_B10G10R10A2,
    gcvSURF_X4B4G4R4,
    gcvSURF_X1B5G5R5,
    gcvSURF_B4G4R4X4,
    gcvSURF_B5G5R5X1,
    gcvSURF_X2B10G10R10,
    gcvSURF_B8G8R8_SNORM,
    gcvSURF_X8B8G8R8_SNORM,
    gcvSURF_A8B8G8R8_SNORM,
    gcvSURF_A8B12G12R12_2_A8R8G8B8,
    gcvSURF_B8G8R8_PLANAR,

    /* Compressed formats. */
    gcvSURF_DXT1                = 400,
    gcvSURF_DXT2,
    gcvSURF_DXT3,
    gcvSURF_DXT4,
    gcvSURF_DXT5,
    gcvSURF_CXV8U8,
    gcvSURF_ETC1,
    gcvSURF_R11_EAC,
    gcvSURF_SIGNED_R11_EAC,
    gcvSURF_RG11_EAC,
    gcvSURF_SIGNED_RG11_EAC,
    gcvSURF_RGB8_ETC2,
    gcvSURF_SRGB8_ETC2,
    gcvSURF_RGB8_PUNCHTHROUGH_ALPHA1_ETC2,
    gcvSURF_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2,
    gcvSURF_RGBA8_ETC2_EAC,
    gcvSURF_SRGB8_ALPHA8_ETC2_EAC,
    gcvSURF_SDXT1,
    gcvSURF_SDXT3,
    gcvSURF_SDXT5,

    /* YUV formats. */
    gcvSURF_YUY2                = 500,
    gcvSURF_UYVY,
    gcvSURF_YV12,
    gcvSURF_I420,
    gcvSURF_NV12,
    gcvSURF_NV21,
    gcvSURF_NV16,
    gcvSURF_NV61,
    gcvSURF_YVYU,
    gcvSURF_VYUY,
    gcvSURF_AYUV,
    gcvSURF_YUV420_10_ST,
    gcvSURF_YUV420_TILE_ST,
    gcvSURF_YUV420_TILE_10_ST,
    gcvSURF_NV12_10BIT,
    gcvSURF_NV21_10BIT,
    gcvSURF_NV16_10BIT,
    gcvSURF_NV61_10BIT,
    gcvSURF_P010,
    gcvSURF_P010_LSB,
    gcvSURF_I010,
    gcvSURF_I010_LSB,
    gcvSURF_YUV420_101010,
    gcvSURF_GRAY8,
#if gcdVG_ONLY
    gcvSURF_AYUY2,
    gcvSURF_ANV12,
    gcvSURF_ANV16,
    gcvSURF_AUYVY,
    gcvSURF_YV16,
#endif

    /* Depth formats. */
    gcvSURF_D16                 = 600,
    gcvSURF_D24S8,
    gcvSURF_D32,
    gcvSURF_D24X8,
    gcvSURF_D32F,
    gcvSURF_S8D32F,
    gcvSURF_S8D32F_1_G32R32F,
    gcvSURF_S8D32F_2_A8R8G8B8,
    gcvSURF_D24S8_1_A8R8G8B8,
    gcvSURF_S8,
    gcvSURF_X24S8,
    gcvSURF_X24S8_1_A8R8G8B8,

    /* Alpha formats. */
    gcvSURF_A4                  = 700,
    gcvSURF_A8,
    gcvSURF_A12,
    gcvSURF_A16,
    gcvSURF_A32,
    gcvSURF_A1,

    /* Luminance formats. */
    gcvSURF_L4                  = 800,
    gcvSURF_L8,
    gcvSURF_L12,
    gcvSURF_L16,
    gcvSURF_L32,
    gcvSURF_L1,
    gcvSURF_L8_RAW,

    /* Alpha/Luminance formats. */
    gcvSURF_A4L4                = 900,
    gcvSURF_A2L6,
    gcvSURF_A8L8,
    gcvSURF_A4L12,
    gcvSURF_A12L12,
    gcvSURF_A16L16,

    gcvSURF_A8L8_1_A8R8G8B8,

    gcvSURF_A8L8_RAW,

    /* Bump formats. */
    gcvSURF_L6V5U5              = 1000,
    gcvSURF_V8U8,
    gcvSURF_X8L8V8U8,
    gcvSURF_Q8W8V8U8,
    gcvSURF_A2W10V10U10,
    gcvSURF_V16U16,
    gcvSURF_Q16W16V16U16,

    /* R/RG/RA formats. */
    gcvSURF_R8                  = 1100,
    gcvSURF_X8R8,
    gcvSURF_G8R8,
    gcvSURF_X8G8R8,
    gcvSURF_A8R8,
    gcvSURF_R16,
    gcvSURF_X16R16,
    gcvSURF_G16R16,
    gcvSURF_X16G16R16,
    gcvSURF_A16R16,
    gcvSURF_R32,
    gcvSURF_X32R32,
    gcvSURF_G32R32,
    gcvSURF_X32G32R32,
    gcvSURF_A32R32,
    gcvSURF_RG16,
    gcvSURF_R8_SNORM,
    gcvSURF_G8R8_SNORM,

    gcvSURF_R8_1_X8R8G8B8,
    gcvSURF_G8R8_1_X8R8G8B8,

    /* Floating point formats. */
    gcvSURF_R16F                = 1200,
    gcvSURF_X16R16F,
    gcvSURF_G16R16F,
    gcvSURF_X16G16R16F,
    gcvSURF_B16G16R16F,
    gcvSURF_X16B16G16R16F,
    gcvSURF_A16B16G16R16F,
    gcvSURF_R32F,
    gcvSURF_X32R32F,
    gcvSURF_G32R32F,
    gcvSURF_X32G32R32F,
    gcvSURF_B32G32R32F,
    gcvSURF_X32B32G32R32F,
    gcvSURF_A32B32G32R32F,
    gcvSURF_A16F,
    gcvSURF_L16F,
    gcvSURF_A16L16F,
    gcvSURF_A16R16F,
    gcvSURF_A32F,
    gcvSURF_L32F,
    gcvSURF_A32L32F,
    gcvSURF_A32R32F,
    gcvSURF_E5B9G9R9,
    gcvSURF_B10G11R11F,
    gcvSURF_B16G16R16F_PLANAR,
    gcvSURF_B32G32R32F_PLANAR,
    gcvSURF_R16G16B16F,
    gcvSURF_R32G32B32F,

    gcvSURF_GRAY16F,
    gcvSURF_GRAY32F,

    gcvSURF_X16B16G16R16F_2_A8R8G8B8,
    gcvSURF_A16B16G16R16F_2_A8R8G8B8,
    gcvSURF_A16B16G16R16F_2_G16R16F,
    gcvSURF_G32R32F_2_A8R8G8B8,
    gcvSURF_X32B32G32R32F_2_G32R32F,
    gcvSURF_A32B32G32R32F_2_G32R32F,
    gcvSURF_X32B32G32R32F_4_A8R8G8B8,
    gcvSURF_A32B32G32R32F_4_A8R8G8B8,

    gcvSURF_R16F_1_A4R4G4B4,
    gcvSURF_G16R16F_1_A8R8G8B8,
    gcvSURF_B16G16R16F_2_A8R8G8B8,

    gcvSURF_R32F_1_A8R8G8B8,
    gcvSURF_B32G32R32F_3_A8R8G8B8,
    gcvSURF_B10G11R11F_1_A8R8G8B8,

    gcvSURF_A32F_1_R32F,
    gcvSURF_L32F_1_R32F,
    gcvSURF_A32L32F_1_G32R32F,

    gcvSURF_R16G16B16F_PLANAR,
    gcvSURF_R32G32B32F_PLANAR,

    /* sRGB format. */
    gcvSURF_SBGR8               = 1400,
    gcvSURF_A8_SBGR8,
    gcvSURF_X8_SBGR8,
    gcvSURF_A8_SRGB8,
    gcvSURF_X8_SRGB8,

    /* Integer formats. */
    gcvSURF_R8I                 = 1500,
    gcvSURF_R8UI,
    gcvSURF_R16I,
    gcvSURF_R16UI,
    gcvSURF_R32I,
    gcvSURF_R32UI,
    gcvSURF_X8R8I,
    gcvSURF_G8R8I,
    gcvSURF_X8R8UI,
    gcvSURF_G8R8UI,
    gcvSURF_X16R16I,
    gcvSURF_G16R16I,
    gcvSURF_X16R16UI,
    gcvSURF_G16R16UI,
    gcvSURF_X32R32I,
    gcvSURF_G32R32I,
    gcvSURF_X32R32UI,
    gcvSURF_G32R32UI,
    gcvSURF_X8G8R8I,
    gcvSURF_B8G8R8I,
    gcvSURF_X8G8R8UI,
    gcvSURF_B8G8R8UI,
    gcvSURF_X16G16R16I,
    gcvSURF_B16G16R16I,
    gcvSURF_X16G16R16UI,
    gcvSURF_B16G16R16UI,
    gcvSURF_X32G32R32I,
    gcvSURF_B32G32R32I,
    gcvSURF_X32G32R32UI,
    gcvSURF_B32G32R32UI,
    gcvSURF_X8B8G8R8I,
    gcvSURF_A8B8G8R8I,
    gcvSURF_X8B8G8R8UI,
    gcvSURF_A8B8G8R8UI,
    gcvSURF_X16B16G16R16I,
    gcvSURF_A16B16G16R16I,
    gcvSURF_X16B16G16R16UI,
    gcvSURF_A16B16G16R16UI,
    gcvSURF_X32B32G32R32I,
    gcvSURF_A32B32G32R32I,
    gcvSURF_X32B32G32R32UI,
    gcvSURF_A32B32G32R32UI,
    gcvSURF_A2B10G10R10UI,
    gcvSURF_G32R32I_2_A8R8G8B8,
    gcvSURF_G32R32I_1_G32R32F,
    gcvSURF_G32R32UI_2_A8R8G8B8,
    gcvSURF_G32R32UI_1_G32R32F,
    gcvSURF_X16B16G16R16I_2_A8R8G8B8,
    gcvSURF_X16B16G16R16I_1_G32R32F,
    gcvSURF_A16B16G16R16I_2_A8R8G8B8,
    gcvSURF_A16B16G16R16I_1_G32R32F,
    gcvSURF_X16B16G16R16UI_2_A8R8G8B8,
    gcvSURF_X16B16G16R16UI_1_G32R32F,
    gcvSURF_A16B16G16R16UI_2_A8R8G8B8,
    gcvSURF_A16B16G16R16UI_1_G32R32F,
    gcvSURF_X32B32G32R32I_2_G32R32I,
    gcvSURF_A32B32G32R32I_2_G32R32I,
    gcvSURF_A32B32G32R32I_2_G32R32F,
    gcvSURF_X32B32G32R32I_3_A8R8G8B8,
    gcvSURF_A32B32G32R32I_4_A8R8G8B8,
    gcvSURF_X32B32G32R32UI_2_G32R32UI,
    gcvSURF_A32B32G32R32UI_2_G32R32UI,
    gcvSURF_A32B32G32R32UI_2_G32R32F,
    gcvSURF_X32B32G32R32UI_3_A8R8G8B8,
    gcvSURF_A32B32G32R32UI_4_A8R8G8B8,
    gcvSURF_A2B10G10R10UI_1_A8R8G8B8,
    gcvSURF_A8B8G8R8I_1_A8R8G8B8,
    gcvSURF_A8B8G8R8UI_1_A8R8G8B8,
    gcvSURF_R8I_1_A4R4G4B4,
    gcvSURF_R8UI_1_A4R4G4B4,
    gcvSURF_R16I_1_A4R4G4B4,
    gcvSURF_R16UI_1_A4R4G4B4,
    gcvSURF_R32I_1_A8R8G8B8,
    gcvSURF_R32UI_1_A8R8G8B8,
    gcvSURF_X8R8I_1_A4R4G4B4,
    gcvSURF_X8R8UI_1_A4R4G4B4,
    gcvSURF_G8R8I_1_A4R4G4B4,
    gcvSURF_G8R8UI_1_A4R4G4B4,
    gcvSURF_X16R16I_1_A4R4G4B4,
    gcvSURF_X16R16UI_1_A4R4G4B4,
    gcvSURF_G16R16I_1_A8R8G8B8,
    gcvSURF_G16R16UI_1_A8R8G8B8,
    gcvSURF_X32R32I_1_A8R8G8B8,
    gcvSURF_X32R32UI_1_A8R8G8B8,
    gcvSURF_X8G8R8I_1_A4R4G4B4,
    gcvSURF_X8G8R8UI_1_A4R4G4B4,
    gcvSURF_B8G8R8I_1_A8R8G8B8,
    gcvSURF_B8G8R8UI_1_A8R8G8B8,
    gcvSURF_B16G16R16I_2_A8R8G8B8,
    gcvSURF_B16G16R16I_1_G32R32F,
    gcvSURF_B16G16R16UI_2_A8R8G8B8,
    gcvSURF_B16G16R16UI_1_G32R32F,
    gcvSURF_B32G32R32I_3_A8R8G8B8,
    gcvSURF_B32G32R32UI_3_A8R8G8B8,
    gcvSURF_A16B16G16R16_2_A8R8G8B8,
    gcvSURF_R8G8B8_1_A8R8G8B8,
    gcvSURF_G16R16_1_A8R8G8B8,
    gcvSURF_A2B10G10R10_1_A8R8G8B8,
    gcvSURF_A2R10G10B10_1_A8R8G8B8,
    gcvSURF_A2W10V10U10_1_A8R8G8B8,

    /* ASTC formats. */
    gcvSURF_ASTC4x4             = 1600,
    gcvSURF_ASTC5x4,
    gcvSURF_ASTC5x5,
    gcvSURF_ASTC6x5,
    gcvSURF_ASTC6x6,
    gcvSURF_ASTC8x5,
    gcvSURF_ASTC8x6,
    gcvSURF_ASTC8x8,
    gcvSURF_ASTC10x5,
    gcvSURF_ASTC10x6,
    gcvSURF_ASTC10x8,
    gcvSURF_ASTC10x10,
    gcvSURF_ASTC12x10,
    gcvSURF_ASTC12x12,
    gcvSURF_ASTC4x4_SRGB,
    gcvSURF_ASTC5x4_SRGB,
    gcvSURF_ASTC5x5_SRGB,
    gcvSURF_ASTC6x5_SRGB,
    gcvSURF_ASTC6x6_SRGB,
    gcvSURF_ASTC8x5_SRGB,
    gcvSURF_ASTC8x6_SRGB,
    gcvSURF_ASTC8x8_SRGB,
    gcvSURF_ASTC10x5_SRGB,
    gcvSURF_ASTC10x6_SRGB,
    gcvSURF_ASTC10x8_SRGB,
    gcvSURF_ASTC10x10_SRGB,
    gcvSURF_ASTC12x10_SRGB,
    gcvSURF_ASTC12x12_SRGB,

    /* Recompile format*/
    gcvSURF_L16_1_A4R4G4B4      = 1700,
    gcvSURF_V16U16_1_A8R8G8B8,
    gcvSURF_Q8W8V8U8_1_A8R8G8B8,
    gcvSURF_X8L8V8U8_1_A8R8G8B8,
    gcvSURF_R3G3B2_1_A8R8G8B8,
    gcvSURF_A8R3G3B2_1_A8R8G8B8,
    gcvSURF_W11V11U10_1_A8R8G8B8,
    gcvSURF_Q16W16V16U16_2_A8R8G8B8,
    gcvSURF_W11V11U10,
    gcvSURF_V8U8_1_A4R4G4B4,
    gcvSURF_A8B8G8R8_1_A8R8G8B8,
    gcvSURF_A32R32G32B32_1_A8R8G8B8,
    gcvSURF_X16B16G16R16F_1_A8R8G8B8,
    gcvSURF_A16B16G16R16F_1_A8R8G8B8,
    gcvSURF_G32R32F_1_A8R8G8B8,
    gcvSURF_X32B32G32R32F_1_A8R8G8B8,
    gcvSURF_A32B32G32R32F_1_A8R8G8B8,
    gcvSURF_G32R32I_1_A8R8G8B8,
    gcvSURF_G32R32UI_1_A8R8G8B8,
    gcvSURF_A32B32G32R32I_1_A8R8G8B8,
    gcvSURF_A32B32G32R32UI_1_A8R8G8B8,
    gcvSURF_Q16W16V16U16_1_A8R8G8B8,
    gcvSURF_A16B16G16R16_1_A8R8G8B8,

    /* Integer formats (2)) */
    gcvSURF_R10G10B10A2UI       = 1800,
    gcvSURF_R5G6B5UI,
    gcvSURF_B5G6R5UI,
    gcvSURF_R3G3B2UI,
    gcvSURF_B2G3R3UI,
    gcvSURF_R4G4B4A4UI,
    gcvSURF_A4B4G4R4UI,
    gcvSURF_R5G5B5A1UI,
    gcvSURF_A1B5G5R5UI,
    gcvSURF_R8G8B8A8UI,

    /* GL4 formats */
    gcvSURF_G8                  = 1900,
    gcvSURF_B8,
    gcvSURF_G32F,
    gcvSURF_B32F,

    /* Intensity formats */
    gcvSURF_I4                  = 2000,
    gcvSURF_I8,
    gcvSURF_I12,
    gcvSURF_I16,

    /* D3D typeless format*/
    gcvSURF_R32G32B32A32_TYPELESS = 2100,
    gcvSURF_R32G32B32_TYPELESS,
    gcvSURF_R16G16B16A16_TYPELESS,
    gcvSURF_R32G32_TYPELESS,
    gcvSURF_R32G8X24_TYPELESS,
    gcvSURF_R32_FLOAT_X8X24_TYPELESS,
    gcvSURF_X32_TYPELESS_G8X24_UINT,
    gcvSURF_R10G10B10A2_TYPELESS,
    gcvSURF_R8G8B8A8_TYPELESS,
    gcvSURF_R16G16_TYPELESS,
    gcvSURF_R32_TYPELESS,
    gcvSURF_R24G8_TYPELESS,
    gcvSURF_R24_UNORM_X8_TYPELESS,
    gcvSURF_X24_TYPELESS_G8_UINT,
    gcvSURF_R8G8_TYPELESS,
    gcvSURF_R16_TYPELESS,
    gcvSURF_R8_TYPELESS,
    gcvSURF_BC1_TYPELESS,
    gcvSURF_BC2_TYPELESS,
    gcvSURF_BC3_TYPELESS,
    gcvSURF_BC4_TYPELESS,
    gcvSURF_BC5_TYPELESS,
    gcvSURF_B8G8R8A8_TYPELESS,
    gcvSURF_B8G8R8X8_TYPELESS,
    gcvSURF_BC6H_TYPELESS,
    gcvSURF_BC7_TYPELESS,
} gceSURF_FORMAT;

/* Pipes. */
typedef enum _gcePIPE_SELECT {
    gcvPIPE_INVALID = ~0,
    gcvPIPE_3D      =  0,
    gcvPIPE_2D
} gcePIPE_SELECT;

/* Hardware type. */
typedef enum _gceHARDWARE_TYPE {
    gcvHARDWARE_INVALID,
    gcvHARDWARE_3D2D,
    gcvHARDWARE_3D,
    gcvHARDWARE_2D,
    gcvHARDWARE_VIP,
    gcvHARDWARE_VG,
    gcvHARDWARE_NUM_TYPES,
} gceHARDWARE_TYPE;

/* User signal command codes. */
typedef enum _gceUSER_SIGNAL_COMMAND_CODES {
    gcvUSER_SIGNAL_CREATE,
    gcvUSER_SIGNAL_DESTROY,
    gcvUSER_SIGNAL_SIGNAL,
    gcvUSER_SIGNAL_WAIT,
    gcvUSER_SIGNAL_MAP,
    gcvUSER_SIGNAL_UNMAP,
} gceUSER_SIGNAL_COMMAND_CODES;

/* Shared buffer command codes. */
typedef enum _gceSHBUF_COMMAND_CODES {
    gcvSHBUF_CREATE,
    gcvSHBUF_DESTROY,
    gcvSHBUF_MAP,
    gcvSHBUF_WRITE,
    gcvSHBUF_READ,
} gceSHBUF_COMMAND_CODES;

/* Event locations. */
typedef enum _gceKERNEL_WHERE {
    gcvKERNEL_COMMAND,
    gcvKERNEL_VERTEX,
    gcvKERNEL_TRIANGLE,
    gcvKERNEL_TEXTURE,
    gcvKERNEL_PIXEL,
    gcvKERNEL_BLT,
} gceKERNEL_WHERE;

typedef enum _gceBLOCK {
    gcvBLOCK_COMMAND,
    gcvBLOCK_TESSELLATOR,
    gcvBLOCK_TESSELLATOR2,
    gcvBLOCK_TESSELLATOR3,
    gcvBLOCK_RASTER,
    gcvBLOCK_VG,
    gcvBLOCK_VG2,
    gcvBLOCK_VG3,
    gcvBLOCK_PIXEL,

    /* Number of defined blocks. */
    gcvBLOCK_COUNT
} gceBLOCK;

typedef enum _gceCORE_3D_MASK {
    gcvCORE_3D_0_MASK   = (1 << 0),
    gcvCORE_3D_1_MASK   = (1 << 1),

    gcvCORE_3D_ALL_MASK = (0xFFFF)
} gceCORE_3D_MASK;

typedef enum _gceCORE_3D_ID {
    gcvCORE_3D_0_ID       = 0,
    gcvCORE_3D_1_ID       = 1,

    gcvCORE_3D_ID_INVALID = ~0UL
} gceCORE_3D_ID;

typedef enum _gceCORE_2D_MASK {
    gcvCORE_2D_0_MASK   = (1 << 0),
    gcvCORE_2D_1_MASK   = (1 << 1),
    gcvCORE_2D_2_MASK   = (1 << 2),
    gcvCORE_2D_3_MASK   = (1 << 3),

    gcvCORE_2D_ALL_MASK = (0xFFFF)
} gceCORE_2D_MASK;

typedef enum _gceCORE_2D_ID {
    gcvCORE_2D_0_ID       = 0,
    gcvCORE_2D_1_ID       = 1,

    gcvCORE_2D_ID_INVALID = ~0UL
} gceCORE_2D_ID;


typedef enum _gceCHIP_FLAG {
    gcvCHIP_FLAG_MSAA_COHERENCEY_ECO_FIX = 1 << 0,
    gcvCHIP_FLAG_GC2000_R2               = 1 << 1,
    gcvCHIP_AXI_BUS128_BITS              = 1 << 2,
} gceCHIP_FLAG;

/* If different, choose render engine */
#define PRIORITY_ENGINE(a, b) gcmMIN(a, b)

typedef enum {
    gcvENGINE_RENDER            = 0,
    gcvENGINE_BLT               = 1,
    gcvENGINE_GPU_ENGINE_COUNT  = 2,
    gcvENGINE_CPU               = gcvENGINE_GPU_ENGINE_COUNT,
    gcvENGINE_ALL_COUNT         = gcvENGINE_CPU + 1,
    gcvENGINE_INVALID           = gcvENGINE_ALL_COUNT + 0x100
} gceENGINE;

/* CORE enum. */
typedef enum _gceCORE {
    gcvCORE_MAJOR,
    gcvCORE_3D1,
    gcvCORE_3D2,
    gcvCORE_3D3,
    gcvCORE_3D4,
    gcvCORE_3D5,
    gcvCORE_3D6,
    gcvCORE_3D7,
    gcvCORE_3D8,
    gcvCORE_3D9,
    gcvCORE_3D10,
    gcvCORE_3D11,
    gcvCORE_3D12,
    gcvCORE_3D13,
    gcvCORE_3D14,
    gcvCORE_3D15,
    gcvCORE_3D_MAX = gcvCORE_3D15,
    gcvCORE_2D,
    gcvCORE_2D1,
    gcvCORE_2D2,
    gcvCORE_2D3,
    gcvCORE_2D_MAX = gcvCORE_2D3,
    gcvCORE_VG,
#if gcdDEC_ENABLE_AHB
    gcvCORE_DEC,
#endif
    gcvCORE_COUNT
} gceCORE;

#define gcdCORE_3D_COUNT            (gcvCORE_3D_MAX + 1)
#define gcdCORE_2D_COUNT            4

#define gcdMAX_MAJOR_CORE_COUNT     (gcvCORE_2D_MAX + 1)

#ifndef gcdDEVICE_COUNT
#define gcdDEVICE_COUNT             2
#endif

#ifndef gcdPLATFORM_COUNT
#define gcdPLATFORM_COUNT           gcdDEVICE_COUNT
#endif

#ifndef gcvSRAM_EXT_COUNT
#define gcvSRAM_EXT_COUNT           gcdDEVICE_COUNT
#endif

#ifndef gcdSYSTEM_RESERVE_COUNT
#define gcdSYSTEM_RESERVE_COUNT     gcdDEVICE_COUNT
#endif

#ifndef gcdLOCAL_MEMORY_COUNT
#define gcdLOCAL_MEMORY_COUNT       gcdDEVICE_COUNT
#endif

#ifndef gcdGLOBAL_CORE_COUNT
#define gcdGLOBAL_CORE_COUNT        (gcdDEVICE_COUNT * gcdCORE_3D_COUNT)
#endif

#ifndef gcdGLOBAL_2D_COUNT
#define gcdGLOBAL_2D_COUNT          gcdCORE_2D_COUNT
#endif

#define gcdCHIP_COUNT               gcdGLOBAL_CORE_COUNT

typedef enum _gceSECURE_MODE {
    /* For cores without gcvFEATURE_SECURITY. */
    gcvSECURE_NONE,

    /* Use registers added in gcvFEATURE_SECURITY in normal driver,
     * In this mode, GPU always works under non secure mode and
     * should not touch secure buffer. It is used to test basic function.
     */
    gcvSECURE_IN_NORMAL,

    /* Make use of gcvFEATURE_SECURITY in trust application. */
    gcvSECURE_IN_TA
} gceSECURE_MODE;

/* kernel driver compression option, as it's a system global option,
 * it means kernel driver allows the options, NOT necessarily means it must be on.
 */
typedef enum _gceCOMPRESSION_OPTION {
    gcvCOMPRESSION_OPTION_NONE       = 0x0, /* No any compression */
    gcvCOMPRESSION_OPTION_COLOR      = 0x1, /* Compression for non-msaa color format */
    gcvCOMPRESSION_OPTION_DEPTH      = 0x2, /* Compression for non-msaa depth format */
    gcvCOMPRESSION_OPTION_MSAA_COLOR = 0x4, /* Compression for msaa color */
    gcvCOMPRESSION_OPTION_MSAA_DEPTH = 0x8, /* Compression for msaa depth */

    /* default compressio option */
    gcvCOMPRESSION_OPTION_DEFAULT    = gcvCOMPRESSION_OPTION_DEPTH      |
                                       gcvCOMPRESSION_OPTION_COLOR      |
                                       gcvCOMPRESSION_OPTION_MSAA_COLOR |
                                       gcvCOMPRESSION_OPTION_MSAA_DEPTH,
} gceCOMPRESSION_OPTION;

typedef enum _gceSRAM_INTERNAL {
    gcvSRAM_INTERNAL0 = 0,
    gcvSRAM_INTERNAL1,

    gcvSRAM_INTER_COUNT
} gceSRAM_INTERNAL;

typedef enum _gceFLATMAP_FLAG {
    gcvFLATMAP_DIRECT,
    gcvFLATMAP_SHIFT,
} gceFLATMAP_FLAG;

/* Video memory alloation type. */
typedef enum _gceVIDMEM_TYPE {
    gcvVIDMEM_TYPE_GENERIC          = gcvSURF_TYPE_UNKNOWN,
    gcvVIDMEM_TYPE_INDEX_BUFFER     = gcvSURF_INDEX,
    gcvVIDMEM_TYPE_VERTEX_BUFFER    = gcvSURF_VERTEX,
    gcvVIDMEM_TYPE_TEXTURE          = gcvSURF_TEXTURE,
    gcvVIDMEM_TYPE_COLOR_BUFFER     = gcvSURF_RENDER_TARGET,
    gcvVIDMEM_TYPE_DEPTH_BUFFER     = gcvSURF_DEPTH,
    gcvVIDMEM_TYPE_BITMAP           = gcvSURF_BITMAP,
    gcvVIDMEM_TYPE_TILE_STATUS      = gcvSURF_TILE_STATUS,
    gcvVIDMEM_TYPE_IMAGE            = gcvSURF_IMAGE,
    gcvVIDMEM_TYPE_MASK             = gcvSURF_MASK,
    gcvVIDMEM_TYPE_SCISSOR          = gcvSURF_SCISSOR,
    gcvVIDMEM_TYPE_HZ_BUFFER        = gcvSURF_HIERARCHICAL_DEPTH,
    gcvVIDMEM_TYPE_ICACHE           = gcvSURF_ICACHE,
    gcvVIDMEM_TYPE_TXDESC           = gcvSURF_TXDESC,
    gcvVIDMEM_TYPE_FENCE            = gcvSURF_FENCE,
    gcvVIDMEM_TYPE_TFBHEADER        = gcvSURF_TFBHEADER,
    gcvVIDMEM_TYPE_COMMAND,
    gcvVIDMEM_TYPE_COUNT
} gceVIDMEM_TYPE;

typedef enum _gceTASK {
    gcvTASK_LINK,
    gcvTASK_CLUSTER,
    gcvTASK_INCREMENT,
    gcvTASK_DECREMENT,
    gcvTASK_SIGNAL,
    gcvTASK_LOCKDOWN,
    gcvTASK_UNLOCK_VIDEO_MEMORY,
    gcvTASK_FREE_VIDEO_MEMORY,
    gcvTASK_FREE_CONTIGUOUS_MEMORY,
} gceTASK;

/******************************************************************************
 ******************************** Status Codes ********************************
 ******************************************************************************/

typedef enum _gceSTATUS {
    gcvSTATUS_OK                    =   0,
    gcvSTATUS_FALSE                 =   0,
    gcvSTATUS_TRUE                  =   1,
    gcvSTATUS_NO_MORE_DATA          =   2,
    gcvSTATUS_CACHED                =   3,
    gcvSTATUS_MIPMAP_TOO_LARGE      =   4,
    gcvSTATUS_NAME_NOT_FOUND        =   5,
    gcvSTATUS_NOT_OUR_INTERRUPT     =   6,
    gcvSTATUS_MISMATCH              =   7,
    gcvSTATUS_MIPMAP_TOO_SMALL      =   8,
    gcvSTATUS_LARGER                =   9,
    gcvSTATUS_SMALLER               =   10,
    gcvSTATUS_CHIP_NOT_READY        =   11,
    gcvSTATUS_NEED_CONVERSION       =   12,
    gcvSTATUS_SKIP                  =   13,
    gcvSTATUS_DATA_TOO_LARGE        =   14,
    gcvSTATUS_INVALID_CONFIG        =   15,
    gcvSTATUS_CHANGED               =   16,
    gcvSTATUS_NOT_SUPPORT_DITHER    =   17,
    gcvSTATUS_EXECUTED              =   18,
    gcvSTATUS_TERMINATE             =   19,

    gcvSTATUS_INVALID_ARGUMENT      =   -1,
    gcvSTATUS_INVALID_OBJECT        =   -2,
    gcvSTATUS_OUT_OF_MEMORY         =   -3,
    gcvSTATUS_MEMORY_LOCKED         =   -4,
    gcvSTATUS_MEMORY_UNLOCKED       =   -5,
    gcvSTATUS_HEAP_CORRUPTED        =   -6,
    gcvSTATUS_GENERIC_IO            =   -7,
    gcvSTATUS_INVALID_ADDRESS       =   -8,
    gcvSTATUS_CONTEXT_LOSSED        =   -9,
    gcvSTATUS_TOO_COMPLEX           =   -10,
    gcvSTATUS_BUFFER_TOO_SMALL      =   -11,
    gcvSTATUS_INTERFACE_ERROR       =   -12,
    gcvSTATUS_NOT_SUPPORTED         =   -13,
    gcvSTATUS_MORE_DATA             =   -14,
    gcvSTATUS_TIMEOUT               =   -15,
    gcvSTATUS_OUT_OF_RESOURCES      =   -16,
    gcvSTATUS_INVALID_DATA          =   -17,
    gcvSTATUS_INVALID_MIPMAP        =   -18,
    gcvSTATUS_NOT_FOUND             =   -19,
    gcvSTATUS_NOT_ALIGNED           =   -20,
    gcvSTATUS_INVALID_REQUEST       =   -21,
    gcvSTATUS_GPU_NOT_RESPONDING    =   -22,
    gcvSTATUS_TIMER_OVERFLOW        =   -23,
    gcvSTATUS_VERSION_MISMATCH      =   -24,
    gcvSTATUS_LOCKED                =   -25,
    gcvSTATUS_INTERRUPTED           =   -26,
    gcvSTATUS_DEVICE                =   -27,
    gcvSTATUS_NOT_MULTI_PIPE_ALIGNED =   -28,
    gcvSTATUS_OUT_OF_SAMPLER         =   -29,
    gcvSTATUS_PROBE_LATER           =   -30,
    gcvSTATUS_RESLUT_OVERFLOW       =   -31,
    gcvSTATUS_RECOVERY              =   -32,
    gcvSTATUS_CANCEL_JOB            =   -33,

    /* register allocation errors. */
    gcvSTATUS_OUT_OF_REG_FAIL                   =   -100,

    /* Linker errors. */
    gcvSTATUS_GLOBAL_TYPE_MISMATCH              =   -1000,
    gcvSTATUS_TOO_MANY_ATTRIBUTES               =   -1001,
    gcvSTATUS_TOO_MANY_UNIFORMS                 =   -1002,
    gcvSTATUS_TOO_MANY_VARYINGS                 =   -1003,
    gcvSTATUS_UNDECLARED_VARYING                =   -1004,
    gcvSTATUS_VARYING_TYPE_MISMATCH             =   -1005,
    gcvSTATUS_MISSING_MAIN                      =   -1006,
    gcvSTATUS_NAME_MISMATCH                     =   -1007,
    gcvSTATUS_INVALID_INDEX                     =   -1008,
    gcvSTATUS_UNIFORM_MISMATCH                  =   -1009,
    gcvSTATUS_UNSAT_LIB_SYMBOL                  =   -1010,
    gcvSTATUS_TOO_MANY_SHADERS                  =   -1011,
    gcvSTATUS_LINK_INVALID_SHADERS              =   -1012,
    gcvSTATUS_CS_NO_WORKGROUP_SIZE              =   -1013,
    gcvSTATUS_LINK_LIB_ERROR                    =   -1014,

    gcvSTATUS_SHADER_VERSION_MISMATCH           =   -1015,
    gcvSTATUS_TOO_MANY_INSTRUCTION              =   -1016,
    gcvSTATUS_SSBO_MISMATCH                     =   -1017,
    gcvSTATUS_TOO_MANY_OUTPUT                   =   -1018,
    gcvSTATUS_TOO_MANY_INPUT                    =   -1019,
    gcvSTATUS_NOT_SUPPORT_CL                    =   -1020,
    gcvSTATUS_NOT_SUPPORT_INTEGER               =   -1021,
    gcvSTATUS_UNIFORM_TYPE_MISMATCH             =   -1022,

    gcvSTATUS_MISSING_PRIMITIVE_TYPE            =   -1023,
    gcvSTATUS_MISSING_OUTPUT_VERTEX_COUNT       =   -1024,
    gcvSTATUS_NON_INVOCATION_ID_AS_INDEX        =   -1025,
    gcvSTATUS_INPUT_ARRAY_SIZE_MISMATCH         =   -1026,
    gcvSTATUS_OUTPUT_ARRAY_SIZE_MISMATCH        =   -1027,
    gcvSTATUS_LOCATION_ALIASED                  =   -1028,
    gcvSTATUS_LOCATION_OVERLAP                  =   -1029,
    gcvSTATUS_LOCATION_NOTCONSISTENT            =   -1030,

    /* Compiler errors. */
    gcvSTATUS_COMPILER_FE_PREPROCESSOR_ERROR    =   -2000,
    gcvSTATUS_COMPILER_FE_PARSER_ERROR          =   -2001,

    /* Recompilation Errors */
    gcvSTATUS_RECOMPILER_CONVERT_UNIMPLEMENTED  =   -3000,
} gceSTATUS;

/* The patch types. */
enum _gceHAL_PATCH_TYPE {
    gcvHAL_PATCH_VIDMEM_ADDRESS = 1,
    gcvHAL_PATCH_MCFE_SEMAPHORE,
    gcvHAL_PATCH_VIDMEM_TIMESTAMP,

    /* Must be the last one for counting. */
    gcvHAL_PATCH_TYPE_COUNT,
};

/******************************************************************************
 ******************************** Command Codes *******************************
 ******************************************************************************/

typedef enum _gceHAL_COMMAND_CODES {
    /*************** Common ***************/

    /* Chip info: count, type and so on. */
    gcvHAL_CHIP_INFO,

    /* HAL driver version. */
    gcvHAL_VERSION,

    /* Query chip id and options. */
    gcvHAL_QUERY_CHIP_IDENTITY,
    gcvHAL_QUERY_CHIP_OPTION,

    /* Query chip frequency, used by CL. */
    gcvHAL_QUERY_CHIP_FREQUENCY,

    /* Query system pool video memory, used by CL. */
    gcvHAL_QUERY_VIDEO_MEMORY,

    /* Memory management. */
    gcvHAL_ALLOCATE_LINEAR_VIDEO_MEMORY,
    gcvHAL_WRAP_USER_MEMORY,
    gcvHAL_RELEASE_VIDEO_MEMORY,
    gcvHAL_LOCK_VIDEO_MEMORY,
    gcvHAL_UNLOCK_VIDEO_MEMORY,
    gcvHAL_BOTTOM_HALF_UNLOCK_VIDEO_MEMORY,
    gcvHAL_MAP_MEMORY,
    gcvHAL_UNMAP_MEMORY,

    /* Cache operations. */
    gcvHAL_CACHE,

    /* HAL user attach and detach. */
    gcvHAL_ATTACH,
    gcvHAL_DETACH,

    /* Event commit. */
    gcvHAL_EVENT_COMMIT,

    /* User command commit. */
    gcvHAL_COMMIT,

    /* Set hardware timeout, used by CL. */
    gcvHAL_SET_TIMEOUT,

    /* User signal operations. */
    gcvHAL_USER_SIGNAL,

    /* Event signal, commit stall. */
    gcvHAL_SIGNAL,

    /* Profile related. */
    gcvHAL_SET_PROFILE_SETTING,
    gcvHAL_READ_PROFILER_REGISTER_SETTING,
    gcvHAL_READ_ALL_PROFILE_REGISTERS_PART1,
    gcvHAL_READ_ALL_PROFILE_REGISTERS_PART2,

    /* Query process database info when debug trace and proflie. */
    gcvHAL_DATABASE,

    /* Power management enable/disable. */
    gcvHAL_CONFIG_POWER_MANAGEMENT,

    /* Debug/dump feature. */
    gcvHAL_DEBUG_DUMP,

    /*************** Common end ***************/

    /*************** GPU only ***************/
    /* Register operations, 2D only. */
    gcvHAL_READ_REGISTER,
    gcvHAL_WRITE_REGISTER,
    gcvHAL_PROFILE_REGISTERS_2D,

    /* Get base address for old mmu. */
    gcvHAL_GET_BASE_ADDRESS,

    /* Read frame database, 3D only. */
    gcvHAL_GET_FRAME_INFO,

    /* Set video memory meta data. */
    gcvHAL_SET_VIDEO_MEMORY_METADATA,

    /* Query command buffer, VG only. */
    gcvHAL_QUERY_COMMAND_BUFFER,

    /* Reset time stamp. */
    gcvHAL_QUERY_RESET_TIME_STAMP,

    /* Create native fence. */
    gcvHAL_CREATE_NATIVE_FENCE,

    /* Wait native fence. */
    gcvHAL_WAIT_NATIVE_FENCE,

    /* Wait until GPU finishes access to a resource. */
    gcvHAL_WAIT_FENCE,

    /* Video memory node operations. */
    gcvHAL_EXPORT_VIDEO_MEMORY,
    gcvHAL_NAME_VIDEO_MEMORY,
    gcvHAL_IMPORT_VIDEO_MEMORY,

    /* Mutex Operation. */
    gcvHAL_DEVICE_MUTEX,
    /*************** GPU only end ***************/

    /*************** DEC only ***************/
    /* DEC200 test. */
    gcvHAL_DEC200_TEST,

    /* DEC300 related operations. */
    gcvHAL_DEC300_READ,
    gcvHAL_DEC300_WRITE,
    gcvHAL_DEC300_FLUSH,
    gcvHAL_DEC300_FLUSH_WAIT,
    /*************** DEC only end ***************/

    /*************** OS specific ***************/

    /* Android gralloc: shared buffer operations. */
    gcvHAL_SHBUF,

    /* Android gralloc: get graphic buffer fd. */
    gcvHAL_GET_GRAPHIC_BUFFER_FD,

    /* Vsimulator only. */
    gcvHAL_UPDATE_DEBUG_CALLBACK,
    gcvHAL_CONFIG_CTX_FRAMEWORK,

    /* Non paged memory management backup compatibility, windows, qnx. */
    gcvHAL_ALLOCATE_NON_PAGED_MEMORY,
    gcvHAL_FREE_NON_PAGED_MEMORY,

    /* Write user data, windows only. */
    gcvHAL_WRITE_DATA,

    /*************** OS specific end ***************/

    /*************** Reserved ***************/
    /* Access APB register. */
    gcvHAL_APB_AXIFE_ACCESS,

    /* Trigger a software reset. */
    gcvHAL_RESET,

    /* Command commit done, preemption only. */
    gcvHAL_COMMIT_DONE,

    /* Get video memory file description. */
    gcvHAL_GET_VIDEO_MEMORY_FD,

    /* Get profile setting. */
    gcvHAL_GET_PROFILE_SETTING,

    /* Read/Write register ex. */
    gcvHAL_READ_REGISTER_EX,
    gcvHAL_WRITE_REGISTER_EX,

    /* Power management state. */
    gcvHAL_SET_POWER_MANAGEMENT_STATE,
    gcvHAL_QUERY_POWER_MANAGEMENT_STATE,

    /* Query CPU frequency. */
    gcvHAL_QUERY_CPU_FREQUENCY,

    /* Dump HW register state. */
    gcvHAL_DUMP_GPU_STATE,

    /* Sync video memory for special memory pool */
    gcvHAL_SYNC_VIDEO_MEMORY,

    /* Cancel Job. */
    gcvHAL_CANCEL_JOB,

    /* Timer. */
    gcvHAL_TIMESTAMP,

    /* FSCALE_VAL. */
    gcvHAL_SET_FSCALE_VALUE,
    gcvHAL_GET_FSCALE_VALUE,

    /* Destroy MMU. */
    gcvHAL_DESTROY_MMU,

    /* Operate fence from user*/
    gcvHAL_FENCE_OP,
    /*************** Reserved end ***************/
} gceHAL_COMMAND_CODES;

/******************************************************************************
 ******************************* gcsOBJECT Object *****************************
 ******************************************************************************/

/* Macro to combine four characters into a Charcater Code. */
#define gcmCC(c1, c2, c3, c4) \
(\
     (char)(c1)        |      \
    ((char)(c2) <<  8) |      \
    ((char)(c3) << 16) |      \
    ((char)(c4) << 24)        \
)

/* Type of objects. */
typedef enum _gceOBJECT_TYPE {
    gcvOBJ_UNKNOWN              = 0,
    gcvOBJ_2D                   = gcmCC('2', 'D', ' ', ' '),
    gcvOBJ_3D                   = gcmCC('3', 'D', ' ', ' '),
    gcvOBJ_ATTRIBUTE            = gcmCC('A', 'T', 'T', 'R'),
    gcvOBJ_BRUSHCACHE           = gcmCC('B', 'R', 'U', '$'),
    gcvOBJ_BRUSHNODE            = gcmCC('B', 'R', 'U', 'n'),
    gcvOBJ_BRUSH                = gcmCC('B', 'R', 'U', 'o'),
    gcvOBJ_BUFFER               = gcmCC('B', 'U', 'F', 'R'),
    gcvOBJ_COMMAND              = gcmCC('C', 'M', 'D', ' '),
    gcvOBJ_COMMANDBUFFER        = gcmCC('C', 'M', 'D', 'B'),
    gcvOBJ_CONTEXT              = gcmCC('C', 'T', 'X', 'T'),
    gcvOBJ_DEVICE               = gcmCC('D', 'E', 'V', ' '),
    gcvOBJ_DUMP                 = gcmCC('D', 'U', 'M', 'P'),
    gcvOBJ_EVENT                = gcmCC('E', 'V', 'N', 'T'),
    gcvOBJ_FUNCTION             = gcmCC('F', 'U', 'N', 'C'),
    gcvOBJ_HAL                  = gcmCC('H', 'A', 'L', ' '),
    gcvOBJ_HARDWARE             = gcmCC('H', 'A', 'R', 'D'),
    gcvOBJ_HEAP                 = gcmCC('H', 'E', 'A', 'P'),
    gcvOBJ_INDEX                = gcmCC('I', 'N', 'D', 'X'),
    gcvOBJ_INTERRUPT            = gcmCC('I', 'N', 'T', 'R'),
    gcvOBJ_KERNEL               = gcmCC('K', 'E', 'R', 'N'),
    gcvOBJ_KERNEL_FUNCTION      = gcmCC('K', 'F', 'C', 'N'),
    gcvOBJ_MEMORYBUFFER         = gcmCC('M', 'E', 'M', 'B'),
    gcvOBJ_MMU                  = gcmCC('M', 'M', 'U', ' '),
    gcvOBJ_OS                   = gcmCC('O', 'S', ' ', ' '),
    gcvOBJ_OUTPUT               = gcmCC('O', 'U', 'T', 'P'),
    gcvOBJ_PAINT                = gcmCC('P', 'N', 'T', ' '),
    gcvOBJ_PATH                 = gcmCC('P', 'A', 'T', 'H'),
    gcvOBJ_QUEUE                = gcmCC('Q', 'U', 'E', ' '),
    gcvOBJ_SAMPLER              = gcmCC('S', 'A', 'M', 'P'),
    gcvOBJ_SHADER               = gcmCC('S', 'H', 'D', 'R'),
    gcvOBJ_VIR_SHADER           = gcmCC('V', 'S', 'D', 'R'),
    gcvOBJ_STREAM               = gcmCC('S', 'T', 'R', 'M'),
    gcvOBJ_SURF                 = gcmCC('S', 'U', 'R', 'F'),
    gcvOBJ_TEXTURE              = gcmCC('T', 'X', 'T', 'R'),
    gcvOBJ_UNIFORM              = gcmCC('U', 'N', 'I', 'F'),
    gcvOBJ_VARIABLE             = gcmCC('V', 'A', 'R', 'I'),
    gcvOBJ_VERTEX               = gcmCC('V', 'R', 'T', 'X'),
    gcvOBJ_VIDMEM               = gcmCC('V', 'M', 'E', 'M'),
    gcvOBJ_VIDMEM_BLOCK         = gcmCC('V', 'M', 'B', 'K'),
    gcvOBJ_VG                   = gcmCC('V', 'G', ' ', ' '),
    gcvOBJ_BUFOBJ               = gcmCC('B', 'U', 'F', 'O'),
    gcvOBJ_UNIFORM_BLOCK        = gcmCC('U', 'B', 'L', 'K'),
    gcvOBJ_CL                   = gcmCC('C', 'L', ' ', ' '),
    gcvOBJ_STORAGE_BLOCK        = gcmCC('S', 'B', 'L', 'K'),
    gcvOBJ_IO_BLOCK             = gcmCC('I', 'O', 'B', 'K'),
} gceOBJECT_TYPE;

/* Video memory pool type. */
typedef enum _gcePOOL {
    gcvPOOL_UNKNOWN = 0,
    gcvPOOL_DEFAULT,
    gcvPOOL_LOCAL,
    gcvPOOL_LOCAL_INTERNAL,
    gcvPOOL_LOCAL_EXTERNAL,
    gcvPOOL_UNIFIED,
    gcvPOOL_SYSTEM,
    gcvPOOL_VIRTUAL,
    gcvPOOL_USER,
    gcvPOOL_INTERNAL_SRAM,
    gcvPOOL_EXTERNAL_SRAM,
    gcvPOOL_LOCAL_EXCLUSIVE,
    gcvPOOL_SYSTEM_32BIT_VA,

    gcvPOOL_NUMBER_OF_POOLS
} gcePOOL;

typedef enum _gceDUMP_BUFFER_TYPE {
    gcvDUMP_BUFFER_USER_STRING,
    gcvDUMP_BUFFER_VERIFY,

    gcvDUMP_BUFFER_MEMORY,
    gcvDUMP_BUFFER_TEXTURE,
    gcvDUMP_BUFFER_STREAM,
    gcvDUMP_BUFFER_INDEX,
    gcvDUMP_BUFFER_BUFOBJ,
    gcvDUMP_BUFFER_IMAGE,
    /* A type of command, but should not execute directly. */
    gcvDUMP_BUFFER_INSTRUCTION,
    gcvDUMP_BUFFER_CONTEXT,
    gcvDUMP_BUFFER_COMMAND,
    gcvDUMP_BUFFER_ASYNC_COMMAND,
    gcvDUMP_BUFFER_USER_TYPE_LAST = gcvDUMP_BUFFER_ASYNC_COMMAND,

    gcvDUMP_BUFFER_KERNEL_CONTEXT,
    gcvDUMP_BUFFER_KERNEL_COMMAND,

    gcvDUMP_BUFFER_PHYSICAL_MEMORY,

    gcvDUMP_BUFFER_TYPE_COUNT,
} gceDUMP_BUFFER_TYPE;

typedef enum _gceLOCK_VIDEO_MEMORY_OP {
    gcvLOCK_VIDEO_MEMORY_OP_NONE   = 0x00,
    gcvLOCK_VIDEO_MEMORY_OP_LOCK   = 0x01,
    gcvLOCK_VIDEO_MEMORY_OP_MAP    = 0x02,
    gcvLOCK_VIDEO_MEMORY_OP_UNLOCK = 0x04,
    gcvLOCK_VIDEO_MEMORY_OP_UNMAP  = 0x08,
} gceLOCK_VIDEO_MEMORY_OP;

typedef enum _gceSIGNAL_STATUS {
    gcvSIGNAL_OK = 0,
    gcvSIGNAL_RECOVERY,
    gcvSIGNAL_CANCEL,
} gceSIGNAL_STATUS;

#if gcdENABLE_VIDEO_MEMORY_MIRROR
typedef enum _gceSYNC_MEMORY_DIRECTION {
    gcvSYNC_MEMORY_DIRECTION_NONE = 0,
    gcvSYNC_MEMORY_DIRECTION_LOCAL_TO_SYSTEM,
    gcvSYNC_MEMORY_DIRECTION_SYSTEM_TO_LOCAL,
} gceSYNC_MEMORY_DIRECTION;

typedef enum _gceMIRROR_TYPE {
    gcvMIRROR_TYPE_NONE = 0,
    gcvMIRROR_TYPE_LOCAL_MEMORY_MIRROR,
    gcvMIRROR_TYPE_SYSTEM_MEMORY_MIRROR,
} gceMIRROR_TYPE;
#endif

typedef enum _gceProfilerMode {
    gcvPROFILER_UNKNOWN_MODE = 0,
    gcvPROFILER_PROBE_MODE,
    gcvPROFILER_AHB_MODE,
} gceProfilerMode;

typedef enum _gceProbeMode {
    gcvPROFILER_UNKNOWN_PROBE = 0,
    gcvPROFILER_GPU_PROBE,
    gcvPROFILER_VIP_PROBE,
} gceProbeMode;

typedef enum _gceMULTI_PROCESSOR_MODE {
    gcvMP_MODE_COMBINED    = 0,
    gcvMP_MODE_INDEPENDENT = 1
} gceMULTI_PROCESSOR_MODE;

typedef enum _gceSwitchMpMode {
    gcvMP_MODE_NO_SWITCH = 0,
    gcvMP_MODE_SWITCH_TO_SINGLE,
    gcvMP_MODE_SWITCH_TO_MULTI,
} gceSwitchMpMode;

#ifdef __cplusplus
}
#endif

#endif /* __gc_hal_enum_shared_h_ */


